[java] gson 파싱(parse) double형 Int형 문제
Javascript 쪽에속 String으로 보낸 값을 파싱할 때,
int형을 double로 파싱하는 경우에 대해서 자체적으로
class를 선언해서 이 부분을 지정해줘야 합니다.
예를 들어 , Map을 사용하는 경우.
Gson 선언 할때, Map 부분으로 파싱할 때, 만든 Java Class로 활용해서 파싱을 하겠다라고 지정해줍니다.
static Gson gson = new GsonBuilder().registerTypeAdapter(Map.class, new MapDeserializer()).setDateFormat("yyyy-MM-dd HH:mm:ss").serializeNulls().create();
Map으로 변환 할때 TypeToken을 지정해줍니다.
//String 값을 map으로 변환
public Map<String , ?> strJsonToHash(String json){
return gson.fromJson(json, new TypeToken<Map<String,Object>>() {}.getType());
}
Map.class, new MapDeserializer()
MapDeserializer.java
public class MapDeserializer implements JsonDeserializer<Map<String, Object>> {
@Override @SuppressWarnings("unchecked")
public Map<String, Object> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
return (Map<String, Object>) read(json);
}
public Object read(JsonElement in) {
if(in.isJsonArray()){
//JsonArray인 경우
List<Object> list = new ArrayList<Object>();
JsonArray arr = in.getAsJsonArray();
for (JsonElement anArr : arr) {
//JsonPrimitive 나올 떄까지 for문
list.add(read(anArr));
}
return list;
}else if(in.isJsonObject()){
Map<String, Object> map = new HashMap<String, Object>();
JsonObject obj = in.getAsJsonObject();
Set<Entry<String, JsonElement>> entitySet = obj.entrySet();
for(Map.Entry<String, JsonElement> entry: entitySet){
//JsonPrimitive 나올 떄까지 for문
map.put(entry.getKey(), read(entry.getValue()));
}
return map;
}else if( in.isJsonPrimitive()){
JsonPrimitive prim = in.getAsJsonPrimitive();
if(prim.isBoolean()){
//true , fales 형으로
return prim.getAsBoolean();
}else if(prim.isString()){
//String으로
return prim.getAsString();
}else if(prim.isNumber()){
Number num = prim.getAsNumber();
//Math.ceil 소수점을 올림한다.
if(Math.ceil(num.doubleValue()) == num.longValue())
//소수점 버림, Int형으로.
return num.longValue();
else{
//소수점 안버림, Double 형으로
return num.doubleValue();
}
}
}
return null;
}
}
결과화면
Int형 값들은 int형으로
Double의 값들은 Double형으로 반환합니다.
'[java]' 카테고리의 다른 글
[java] 자바 날짜 비교하기 (0) | 2019.06.16 |
---|---|
[Java]오늘 날짜 와 시간 표현하기 (0) | 2019.06.16 |
[java] url로 json 값 가져오기. (0) | 2018.12.26 |
[java] javax.net.ssl.SSLPeerUnverifiedException: Hostname not verified: (0) | 2018.12.26 |
파파고 NMT 테스트 / JSP로 해보기 (0) | 2018.10.05 |