Gosn解决在集合中int自动转换为duble类型
程序员文章站
2022-04-04 12:31:28
...
转载请出自出处:http://eksliang.iteye.com/blog/2261478
一、问题
默认会将Object接收的数字转换为double,例如int类型12转换后会变成12.0,解决方案,自定义转换器
二、需要反序列化的实体如下
public class User { private String userName; private String userPwd; private List<Object> lists; // get()跟set()省略......! }
三、JsonDeserializer转换器代码如下
package com.gosun.gson; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; /** * json转为对象时调用 * @author Ickes */ public class ListDeserialize implements JsonDeserializer<List<Object>>{ /** * <pre> * 默认会将Object接收的数字转换为double * 问题: * int类型12转换后会变成12.0,自定义转换的目的就是将他转换为12 * </pre> */ public List<Object> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { //得到数组里面的所有值 Iterator<JsonElement> iterator= json.getAsJsonArray().iterator(); List<Object> list = new ArrayList<Object>(); while (iterator.hasNext()) { JsonElement element = iterator.next(); if(isInteger(element.getAsString())){ list.add(element.getAsInt()); continue; } list.add(element); } return list; } /** * 判断是不是int类型的数字 * @param str * @return * 是int类型返回true */ public boolean isInteger(String str) { Pattern pattern = Pattern.compile("[0-9]+"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } }
四、测试代码如下
package com.gosun.gson; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; /** * json转为对象时调用 * @author Ickes */ public class ListDeserialize implements JsonDeserializer<List<Object>>{ /** * <pre> * 默认会将Object接收的数字转换为double * 问题: * int类型12转换后会变成12.0,自定义转换的目的就是将他转换为12 * </pre> */ public List<Object> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { //得到数组里面的所有值 Iterator<JsonElement> iterator= json.getAsJsonArray().iterator(); List<Object> list = new ArrayList<Object>(); while (iterator.hasNext()) { JsonElement element = iterator.next(); if(isInteger(element.getAsString())){ list.add(element.getAsInt()); continue; } list.add(element); } return list; } /** * 判断是不是int类型的数字 * @param str * @return * 是int类型返回true */ public boolean isInteger(String str) { Pattern pattern = Pattern.compile("[0-9]+"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } }
执行结果如下
#从打印信息可以看出数字12反序列化后变成了12.0 User [userName=ickes, userPwd=12345, lists=[java, 12.0, 12.2]] #使用了转换器后变成了12 User [userName=ickes, userPwd=12345, lists=["java", 12, 12.2]]