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",