当前位置: 代码迷 >> 综合 >> fastjson与jackson-core序列化与反序列化
  详细解决方案

fastjson与jackson-core序列化与反序列化

热度:75   发布时间:2024-01-24 05:14:30.0

一.fastjson序列化与反序列化方式
1.fastjson依赖版本:
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

2.json字符串转换java对象:
a)TypeReference方式转换java对象
MessageDTO<JSONObject> messageDTO = JSONObject.parseObject(json,new TypeReference<MessageDTO<JSONObject>>(){});
注意:
i.转换后的JSONObject中的属性顺序是乱序的。
ii.这个方式比较安全,转换Map时其他方法在某些特殊情况,会报转换报错。


b)转换java对象
JSONObject.toJavaObject(json,Java对象.class)

c)转换成JSONObject对象
JSONObject.parseObject(json)
 
d)class转换成Java对象
JSONObject.parseObject(json,Java对象.class)

3.java对象转换json字符串
通过属性过滤器(SerializeFilter)排除属性与包含属性,来控制转换成JSON字符串属性输出:
String[] excludeProperties = {"属性名1", "属性名2"};
String[] includeProperties = {"属性名1", "属性名1"};
PropertyPreFilters filters = new PropertyPreFilters();
PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
excludefilter.addExcludes(excludeProperties);
PropertyPreFilters.MySimplePropertyPreFilter includefilter = filters.addFilter();
includefilter.addIncludes(includeProperties);

a)转json字符串默认忽略值为null的属性:
json = JSONObject.toJSONString(obj);
或
json = JSONObject.toJSONString(obj, SerializerFeature.PrettyFormat);

b)包含值为null的属性:
 json = JSONObject.toJSONString(obj, SerializerFeature.WriteMapNullValue);
 或
 json = JSONObject.toJSONString(obj, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);

c)默认忽略值为null的属性,排除属性名1和属性名2属性
json = JSONObject.toJSONString(obj, excludefilter, SerializerFeature.PrettyFormat);

d)包含值为null的属性,排除属性名1和属性名2属性
  json = JSONObject.toJSONString(obj, excludefilter, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
  
e)默认忽略值为null的属性,包含属性名1和属性名2属性
  json = JSONObject.toJSONString(obj, includeProperties, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
 
f)包含值为null的属性,强制属性按a-z排序
JSONObject.toJSONString(obj, SerializerFeature.WriteMapNullValue,SerializerFeature.MapSortField)

注意:
i)在实体类添加@JSONType(orders={"属性1","属性2","属性3"}) 指定属性的输出顺序:
@JSONType(orders={"属性1","属性2","属性3"})
public class 实体类 {
 ...
}

ii)在属性上添加@JSONField(ordinal = 1)  指定属性的输出顺序
public class 实体类 {
    @JSONField(ordinal = 1)
    private String 属性1;
    @JSONField(ordinal = 2)
    private Integer 属性2;
}

g)默认创建属性保持属性
JSONObject jsonObject = new JSONObject(true);
jsonObject.put("属性1","属性值")

4.常见问题:
a)Java对象属性有null值时,该属性在转json时会被忽略问题。
解决方案:
在转化json字符串时,增加SerializerFeature.WriteMapNullValue参数,例如:JSONObject.toJSONString(obj,SerializerFeature.WriteMapNullValue);

b)Java对象转化json字符串后,反序列化为非Java对象(JsonObject或Map<String,Object>)后,转化json字符串时属性会错乱问题。
注意:
Java对象转化json字符串时:有序的
非Java对象(JsonObject或Map<String,Object>),转化json字符串时:无序的

解决方案:
在转化json字符串时,增加SerializerFeature.MapSortField参数,进行强制排序。
例如:JSONObject.toJSONString(messageDTO.getBody(), SerializerFeature.WriteMapNullValue,SerializerFeature.MapSortField)


c)fastjson-1.2.7.jar 转化json字符串时会报代码长度过长:
java.lang.ClassFormatError: Invalid method Code length 66865 in class file com/alibaba/fastjson/serializer/ASMSerializer_6_UserKdlb
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
或
java.lang.ClassFormatError: JVMCFRE042 bytecode array size > 65535; class=Serializer_57, offset=53261

解决方案:
升级到1.2.13以后版本,我代码中升级到1.2.47


二.jackson序列化与反序列化方式
1.依赖版本:
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.5.3</version>
        </dependency>
        
2.工具类:
public class JsonUtil {
    public static ObjectMapper objectMapper;

    static {
        objectMapper = new ObjectMapper();
    }

    public static <T> T convertToObject(String jsonStr, Class<T> valueType) {

        try {
            if (StringUtils.isBlank(jsonStr)) {
                return null;
            }
            return objectMapper.readValue(jsonStr, valueType);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static <T> T convertToObject(String jsonStr, TypeReference<T> valueTypeRef) {
        try {
            if (StringUtils.isBlank(jsonStr)) {
                return null;
            }
            return objectMapper.readValue(jsonStr, valueTypeRef);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static <T> T convertToObject(String jsonStr, JavaType javaType) {
        try {
            if (StringUtils.isBlank(jsonStr)) {
                return null;
            }
            return objectMapper.readValue(jsonStr, javaType);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static String convertToJson(Object object) {

        try {
            if (object == null) {
                return null;
            }
            return objectMapper.writeValueAsString(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static <T> T convertToObejctFromKey(String jsonStr,String key,Class<T> valueType)
    {
        try{
            JsonNode node = objectMapper.readTree(jsonStr);
            String nodeString=node.get(key).toString();
            return convertToObject(nodeString,valueType);
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }
    public static String getNodeString(String jsonStr,String key)
    {
        try{
            JsonNode node = objectMapper.readTree(jsonStr);
            return node.get(key).textValue();

        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static List<JsonNode> getJsonObject(String jsonStr, String key){
        try{
            JsonNode node = objectMapper.readTree(jsonStr);
            if(node.get(key).isArray()){
                return node.findValues(key);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static JavaType BuildJavaType(Class<?> c1, Class<?> c2) {
        return objectMapper.getTypeFactory().constructParametricType(c1, c2);
    }
}


3.java序列化json字符串
JsonUtil.convertToJson(obj)
注意:转化json字符串时不会报代码长度过长.

  相关解决方案