解决Gosn在集合中int自动转换为duble类型

来源:互联网 发布:压花辊雕刻加工编程 编辑:程序博客网 时间:2024/06/09 17:53
import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.JsonArray;import com.google.gson.JsonDeserializationContext;import com.google.gson.JsonDeserializer;import com.google.gson.JsonElement;import com.google.gson.JsonObject;import com.google.gson.JsonParseException;import com.google.gson.JsonParser;import java.lang.reflect.Type;import java.util.Iterator;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 验证正则表达式是否能执行出 有效值 * @param param * @param regex * @return boolean */public static  boolean hasFulfilRegex(String param, String regex) {Pattern p = Pattern.compile(regex);Matcher m = p.matcher(param);return m.find();}        /**     * JSON数据转Map,解决Integer默认为Double的问题。     * @param json     * @return     * @throws Exception     */@SuppressWarnings("unchecked")public static List<Map<String, Object>> jsonConvertToList(String json) throws Exception {        //重写Gson    GsonBuilder gsonBuilder = getMapGsonBuilder();        List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();        JsonParser parser = new JsonParser();    JsonElement jsonelement = parser.parse(json);    if(jsonelement.isJsonArray()) {        //使用上面重写过的GsonBuilder创建Gson        Gson gson = gsonBuilder.create();        for(int i=0; i<jsonelement.getAsJsonArray().size(); i++) {    Map<String, Object> map = gson.fromJson(jsonelement.getAsJsonArray().get(i), HashMap.class);    mapList.add(map);    }    } else {    //使用上面重写过的GsonBuilder创建Gson        Gson gson = gsonBuilder.create();                Map<String, Object> map = gson.fromJson(jsonelement, HashMap.class);        mapList.add(map);    }        return mapList;    }    /** * 获取GsonBuilder对象 * @return */    private static GsonBuilder getMapGsonBuilder() {    //重写Gson    GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(HashMap.class, new JsonDeserializer<Object>() {@SuppressWarnings({ "unchecked", "rawtypes" })@Overridepublic Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException {//返回的Map集合Map<String, Object> map = new HashMap<String, Object>();//创建一个JsonArrayJsonArray jsonArray = new JsonArray();//把Json节点装入JsonArray集合中if(jsonelement.isJsonObject()) {jsonArray.add(jsonelement);} else if(jsonelement.isJsonArray()) {jsonArray.addAll(jsonelement.getAsJsonArray());}//循环处理Json节点for(int j=0; j<jsonArray.size(); j++) {//判断是否是Json对象,如果不是,则返回字符串if(jsonArray.get(j).isJsonObject()) {//获取Json对象节点JsonObject jsonObject = jsonArray.get(j).getAsJsonObject();    //开始迭代    Iterator iterator = jsonObject.entrySet().iterator();    while(iterator.hasNext()) {    //通过等号分隔    String[] array = iterator.next().toString().split("=");        //判断是否是Json节点数组    if(jsonObject.get(array[0]).isJsonArray()) {        //获取Json节点数组    JsonArray subJsonArray = jsonObject.get(array[0]).getAsJsonArray();        List<Object> subList = new ArrayList<Object>();        //循环Json节点数组    for(int i=0; i<subJsonArray.size(); i++) {        Map<String, Object> subMap = new HashMap<String, Object>();        //递归获取Json节点数据    Object subObject = deserialize(jsonObject.get(array[0]), type, jsondeserializationcontext);        //判断返回的是否是String字符串    if(Tools.hasFulfilRegex(subObject.getClass().toString(), "java.lang.String")) {    subList.add(String.valueOf(subObject));    } else {    subMap.putAll((Map<String, Object>)subObject);    subList.add(subMap);    }    }    map.put(array[0], subList);        } else if(jsonObject.get(array[0]).isJsonObject()) {        Map<String, Object> subMap = new HashMap<String, Object>();    subMap.putAll((Map<String, Object>)deserialize(jsonObject.get(array[0]), type, jsondeserializationcontext));    map.put(array[0], subMap);        } else if(Tools.hasFulfilRegex(jsonObject.get(array[0]).getAsString().trim(), "^\\d+$")) {    //如果属性值是数字,则转换成Long类型,重写Gson默认转为Double的    map.put(array[0], jsonObject.get(array[0]).getAsLong());    } else if(Tools.hasFulfilRegex(jsonObject.get(array[0]).getAsString().trim(), "^\\d+\\.\\d+$")) {    //如果属性值包含小数点,则转为Double类型    map.put(array[0], jsonObject.get(array[0]).getAsDouble());    } else {    map.put(array[0], jsonObject.get(array[0]).getAsString());    }    }} else {//判断是否是Json对象,如果不是,则返回字符串return jsonArray.get(j).toString();}}        return map;}});        return gsonBuilder;    }


 
原创粉丝点击