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

一.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字符串時不會報代碼長度過長.

發佈了20 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章