1. 程式人生 > >Jackson 自定義序列化 & 反序列化 物件型別

Jackson 自定義序列化 & 反序列化 物件型別

public class JacksonUtils {

    private static final ObjectMapper mapper = new ObjectMapper();

    public static final String CLASS_KEY = "@class";

    public static final String BASE_VALUE_KEY = "\"value\"";
    public static final String BASE_VALUE_NODE_KEY = "value";

    static {
        SimpleModule module = new SimpleModule();
        mapper.enableDefaultTypingAsProperty(NON_FINAL, CLASS_KEY);
        module.addKeyDeserializer(Object.class, new MapKeyDeserializer());
        module.addKeySerializer(Object.class, new MapKeySerializer());
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        mapper.registerModule(module);
    }

    public static String serialize(Object obj) throws SerializationException {
        try {
            return mapper.writeValueAsString(obj);
        } catch (Throwable t) {
            throw new SerializationException(t);
        }
    }

    public static <T> T deserialize(String jsonString, Class<T> clazz) throws
            SerializationException {
        try {
            return mapper.readValue(jsonString, clazz);
        } catch (Throwable t) {
            throw new SerializationException(t);
        }
    }

    public static JsonNode readNode(String jsonString) throws SerializationException {
        try {
            return mapper.readTree(jsonString);
        } catch (Throwable t) {
            throw new SerializationException(t);
        }
    }


}
public class MapKeyDeserializer extends com.fasterxml.jackson.databind.KeyDeserializer {

    @Override
    public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException {
        JsonNode jsonNode = JacksonUtils.readNode(key);
        JsonNode classNode = jsonNode.get(JacksonUtils.CLASS_KEY);

        Class<?> clz = null;
        try {
            clz = Class.forName(classNode.asText());
        } catch (ClassNotFoundException e) {
            throw new IOException(e);
        }

        JsonNode valueNode = jsonNode.get(JacksonUtils.BASE_VALUE_NODE_KEY);

        if (clz.equals(Integer.class)) {
            return Integer.parseInt(valueNode.asText());
        } else if (clz.equals(Boolean.class)) {
            return Boolean.parseBoolean(valueNode.asText());
        } else if (clz.equals(Byte.class)) {
            return Byte.parseByte(valueNode.asText());
        } else if (clz.equals(Short.class)) {
            return Short.parseShort(valueNode.asText());
        } else if (clz.equals(Long.class)) {
            return Long.parseLong(valueNode.asText());
        } else if (clz.equals(Float.class)) {
            return Float.parseFloat(valueNode.asText());
        } else if (clz.equals(Double.class)) {
            return Double.parseDouble(valueNode.asText());
        } else if (clz.equals(String.class)) {
            return valueNode.asText();
        } else if (clz.isEnum()) {
            return JacksonUtils.deserialize(valueNode.toString(), clz);
        } else if (clz.isArray()) {
            return JacksonUtils.deserialize(valueNode.toString(), clz);
        }


        return JacksonUtils.deserialize(key, clz);
    }
}

public class MapKeySerializer extends com.fasterxml.jackson.databind.JsonSerializer {


    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        String keyString = JacksonUtils.serialize(value);
        boolean isFinal = Modifier.isFinal(value.getClass().getModifiers());

        StringBuilder key = new StringBuilder();
        if (isFinal) {

            key.append("{\"").append(JacksonUtils.CLASS_KEY).append("\":\"").append(value.getClass().getName()).append("\",");

            if (value instanceof Integer || value instanceof Boolean
                    || value instanceof Byte || value instanceof Short
                    || value instanceof Long || value instanceof Float
                    || value instanceof Double || value instanceof String) {
                key.append(JacksonUtils.BASE_VALUE_KEY).append(":").append(keyString);
            } else if (value instanceof Enum) {
                key.append(JacksonUtils.BASE_VALUE_KEY).append(":").append(keyString);
            } else if(value.getClass().isArray()){
                key.append(JacksonUtils.BASE_VALUE_KEY).append(":").append(keyString);
            } else if (keyString.startsWith("{")) {
                key.append(keyString.substring(1, keyString.length() - 1));
            } else {
                key.append(keyString);
            }

            key.append("}");
            keyString = key.toString();
        }

        gen.writeFieldName(keyString);
    }
}


相關推薦

定義JsonConverter,序列不符合規範的陣列屬性

如果json 字串不符合規範,可以通過自定義jsonconvert 解決 public class SingleValueArrayConverter<T> : JsonConverter { public override void Writ

Jackson 定義序列 & 序列 物件型別

public class JacksonUtils { private static final ObjectMapper mapper = new ObjectMapper(); public static final String CLASS_KEY

jackson定義全域性序列序列

需要自定義Jackson序列化和反序列化有兩種方式,一種是全域性定義,一種是非全域性定義。先來看看全域性定義。全域性定義的步驟如下

jackson 定義序列

為了讓輸出的JSON檔案更簡潔,或者待序列化的類比較複雜,甚至其中某些欄位沒有實現 Serializable 介面,無法直接進行序列化,此時就需要自定義序列化。 首先定義兩個測試類: public class User { public int id

MapReduce常見演算法 與定義排序及Hadoop序列

MapReduce常見演算法 •單詞計數 •資料去重 •排序 •Top K •選擇  以求最值為例,從100萬資料中選出一行最小值 •投影  以求處理手機上網日誌為例,從其11個欄位選出了五個欄位(列)來顯示我們的手機上網流量 •分組  相當於分割槽,以求處理手機上網日誌為例,喊手機號和非手

Jackson 列舉序列/序列

列舉類: import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; /** * Created by Administr

springmvc使用Jackson序列序列日期

1、序列化 public class CustomDateSerializer extends JsonSerializer { @Override public void serialize(Date value, JsonGenera

MessagePack 新型序列序列方案

only program next sel ges new sys adf 簡介 進入在學習redis的時候,在文中看到了關於MessagePack的簡介,發現非常有意思,於是就花了點時間大致了解了下。 MessagePack介紹: MessagePack is an ef

10.8-全棧Java筆記:序列/序列的步驟和實例

java 本節我們詳細講解10.3節中提到的序列化和反序列化操作。序列化和反序列化是什麽當兩個進程遠程通信時,彼此可以發送各種類型的數據。 無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。比如,我們可以通過http協議發送字符串信息;我們也可以在網絡上直接發送JAVA對象。發送方需要把這個Java對

測試了下boost的序列序列功能

con != bar lan class try hat out ora [cpp] view plain copy // testSerialization.cpp : Defines the entry point for the console

.NET Core protobuf-net、MessagePack、Json.NET序列/序列性能測試

img alt int 序列化 james 最優 5.1 out mar 測試代碼Zonciu/SerializationTest.cs, 源自neuecc/ZeroFormatterBenchmark.cs。 NuGet包及其版本 mgravell/protobuf-ne

深入JAVA序列序列

轉換 zed 一個 源代碼 () bili 什麽 知識點 dom 前言 java序列化與反序列化應該是非常基本的知識點,但細想起來還是一頭霧水, 不知道序列化與反序列化到底底層是如何實現的,所以特意花了些時間整理這篇文章。 所以你如果還只是停留在使用和知道這麽一個知

文件操作,路徑操作,StringIO和BytesIO,序列序列,正則表達式與python中使用

基於 關系 判斷目錄 java、 優先 errors 情況下 water des 文件操作 打開操作open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=Tr

Google Protobuf——實現跨平臺跨語言的序列/序列

Google Protobuf——實現跨平臺跨語言的序列化/反序列化 0 Overview Google Protocol Buffer 是一個平臺無關、語言無關的結構化資料的序列化與反序列化工具。 1 Establish dev environment wget http:

Python json序列 序列,map,reduce,filter

import json # 序列化 反序列化 print(dir(json)) d1=dict(name='小米',age=2,score=99) print(d1) strs=json.dumps(d1) print(strs) d2=json.loads(strs) print(d2)

[leetcode]449. Serialize and Deserialize BST序列序列化二叉搜尋樹(儘量緊湊)

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or trans

二進位制流序列(序列)和XML序列(序列)

序列化(Serialization):序列化是將物件狀態轉換為可儲存或傳輸的其它資料格式的過程。 反序列化(Deserialization) :與序列化相對的是反序列化,將其它資料格式轉換為物件的過程。 作用:將物件中的資料轉換成其它檔案,方便資訊的儲存與交換。  .NET

92 序列 序列

主要內容: 1 反序列化(post請求)   a : 提交post請求, 先確定新增的資料結構,   b: 解決序列化和反序列化的欄位不統一的情框(序列化器中有的欄位, 要序列化的欄位必須有.)     required = False, 只序列化, 不走校驗     read_only: 

92 序列 序列

clas att ida 統一 print -c 更新數據 參數 eth 主要內容: 1 反序列化(post請求)   a : 提交post請求, 先確定新增的數據結構,   b: 解決序列化和反序列化的字段不統一的情框(序列化器中有的字段, 要序列化的字段必須有.)   

DRF序列/序列

反序列化(不推薦版):兩個欄位 一個為正序準備,一個為反序準備重寫create update方法 1. 確定資料結構: 自己定義key book_obj = { "title": "語文sadasd", "pub_time": "2018-11-14",