Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4149135
  • 博文数量: 447
  • 博客积分: 1241
  • 博客等级: 中尉
  • 技术积分: 5786
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 06:48
个人简介

读好书,交益友

文章分类

全部博文(447)

文章存档

2023年(6)

2022年(29)

2021年(49)

2020年(16)

2019年(15)

2018年(23)

2017年(67)

2016年(42)

2015年(51)

2014年(57)

2013年(52)

2012年(35)

2011年(5)

分类: Java

2021-10-23 14:46:37

使用gson转换数据,发现json数据被强制转换为map结构的时候,会出现int变成double的问题

点击(此处)折叠或打开

  1. import com.google.gson.*;
  2. import com.google.gson.internal.LinkedTreeMap;
  3. import com.google.gson.reflect.TypeToken;

  4. import java.lang.reflect.Type;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Set;

  9. public class MapDeserializerDoubleAsIntFix implements JsonDeserializer<Map<String, Object>> {


  10.     @Override
  11.     public Map<String, Object> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
  12.         return (Map<String, Object>) read(jsonElement);
  13.     }

  14.     public Object read(JsonElement in) {
  15.         if(in.isJsonArray()){
  16.             List<Object> list = new ArrayList<>();
  17.             JsonArray arr = in.getAsJsonArray();
  18.             for (JsonElement anArr : arr) {
  19.                 list.add(read(anArr));
  20.             }
  21.             return list;
  22.         }else if(in.isJsonObject()){
  23.             Map<String, Object> map = new LinkedTreeMap<String, Object>();
  24.             JsonObject obj = in.getAsJsonObject();
  25.             Set<Map.Entry<String, JsonElement>> entitySet = obj.entrySet();
  26.             for(Map.Entry<String, JsonElement> entry: entitySet){
  27.                 map.put(entry.getKey(), read(entry.getValue()));
  28.             }
  29.             return map;
  30.         }else if( in.isJsonPrimitive()){
  31.             JsonPrimitive prim = in.getAsJsonPrimitive();
  32.             if(prim.isBoolean()){
  33.                 return prim.getAsBoolean();
  34.             }else if(prim.isString()){
  35.                 return prim.getAsString();
  36.             }else if(prim.isNumber()){
  37.                 Number num = prim.getAsNumber();
  38.                 // here you can handle double int/long values
  39.                 // and return any type you want
  40.                 // this solution will transform 3.0 float to long values
  41.                 if(Math.ceil(num.doubleValue()) == num.longValue())
  42.                     return num.longValue();
  43.                 else{
  44.                     return num.doubleValue();
  45.                 }
  46.             }
  47.         }
  48.         return null;
  49.     }

  50.     public static void main(String[] args) {
  51.         String json = "{\"data\":[{\"id\":1,\"quantity\":2,\"name\":\"apple\"}, {\"id\":3,\"quantity\":4,\"name\":\"orange\"}]}";
  52.         System.out.println("json == " + json);
  53.         Map<String, Object> map2 = new LinkedTreeMap<>();
  54.         map2 = new Gson().fromJson(json, map2.getClass());
  55.         System.out.println(map2);

  56.         GsonBuilder gsonBuilder = new GsonBuilder();
  57.         gsonBuilder.registerTypeAdapter(new TypeToken<Map <String, Object>>(){}.getType(), new MapDeserializerDoubleAsIntFix());
  58.         Gson gson = gsonBuilder.create();
  59.         Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>(){}.getType());
  60.         System.out.println(map);
  61.     }


  62. }

阅读(1754) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~