[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형으로 반환합니다.



블로그 이미지

미나미나미

댓글을 달아 주세요