1. 程式人生 > >Jackson--protobuf序列化積累

Jackson--protobuf序列化積累

一 JACKSON 序列化相關

1  JACKSON序列化問題解決

       最近使用了jackson json來格式化資料輸出,但是反序列化生成物件的時候碰到點麻煩,jackson把資料預設解析成了Map物件,

  經查詢文件,問題解決,在ObjectMapper的readvalue方法中按Object所使用的型別宣告即可,程式碼如下:

Map<Integer, RbtCounter> srcMap = new LinkedHashMap();

Map<Integer, RbtCounter> destMap;

String jsonData = mapper.writeValueAsString(srcMap);

正確:   

destMap = mapper.readValue(jsonData, new TypeReference<Map<Integer, RbtCounter>>(){});   // 反序列化

TypeReference -- 讓Jackson Json在List/Map中識別自己的Object

錯誤

destMap = mapper.readValue(jsonData, LinkedHashMap.class);     List中的自定義Object同理解決。

2 未知屬性異常

在使用的過程中,很有可能會遇到json反序列化的問題。當你物件中有get***()的地方,它就當做它是一個屬性,所以當你序列化json之後,在反序列化的時候,很有可能會出現異常的情況,因為在你的model中沒有這個***的定義。

那該如何處理和解決呢?

1. 在class上新增忽略未知屬性的宣告:@JsonIgnoreProperties(ignoreUnknown=true)

2. 在反序列化中新增忽略未知屬性解析,如下:

複製程式碼
 1 /**
 2  * json deserialize
 3  * @param json
 4  * @param mapClazz
 5  * @return
 6 */
 7 public static Object jsonDeserialize(final String json, final Class<?> mapClazz) {
 8     ObjectMapper om = new
ObjectMapper(); 9 try { 10 // 忽略未知屬性 11 om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 12 return om.readValue(json, mapClazz); 13 } catch (Exception ex) { 14 return null; 15 } 16 }
複製程式碼

3. 新增"Any setter"來處理未知屬性

複製程式碼
1 // note: name does not matter; never auto-detected, need to annotate
2 // (also note that formal argument type #1 must be "String"; second one is usually
3 // "Object", but can be something else -- as long as JSON can be bound to that type)
4 @JsonAnySetter
5 public void handleUnknown(String key, Object value) {
6     // do something: put to a Map; log a warning, whatever
7 }
複製程式碼

4. 註冊問題處理控制代碼

註冊一個DeserializationProblemHandler控制代碼,來呼叫ObjectMapper.addHandler()。當新增的時候,控制代碼的handleUnknownProperty方法可以在每一個未知屬性上呼叫一次。

這個方法在你想要新增一個未知屬性處理日誌的時候非常有用:當屬性不確定的時候,不會引起一個繫結屬性的錯誤


demo 1

第一種:

Java code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class JsonToJavaBean { public static void main(String[] args) { String str="{\"student\":[{\"name\":\"leilei\",\"age\":23},{\"name\":\"leilei02\",\"age\":23}]}"; Student stu = null; List<Student> list = null; try { ObjectMapper objectMapper=new ObjectMapper(); StudentList studentList=objectMapper.readValue(str, StudentList.class); list=studentList.getStudent(); catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); for(Student s:list){ System.out.println(s.getName()+"   "+s.getAge()); } } }

第二種:

相關推薦

Jackson--protobuf序列積累

一 JACKSON 序列化相關 1  JACKSON序列化問題解決        最近使用了jackson json來格式化資料輸出,但是反序列化生成物件的時候碰到點麻煩,jackson把資料預設解析成了Map物件,   經查詢文件,問題解決,在

jackson實現序列的反序列解析

效率 出現 span jsonp cor 作用 pat 阿裏 控制 現在項目開發過程中,字符串的傳遞成為前後端交互的主要方式,主要是因為字符串不會出現亂碼等問題,傳送方式是字節碼傳遞,效率比實體較安全。 常見的Json類庫有Gson、JSON

小白審計JACKSON序列漏洞

ces serialize 簡單 mage 簡單介紹 rac led 代碼審計 ble 1. JACKSON漏洞解析 poc代碼:main.java import com.fasterxml.jackson.databind.ObjectMapper; import co

c++ protobuf序列

clu break bsp getc AR out 序列化 IV while 只看了int類型的序列化,後面的有時間再研究 #include <vector> #include <iostream> int main() { int val

Netty學習(2): protobuf序列框架學習

1. protobuf是什麼     protobuf是google旗下的產品,用於序列化與反序列化資料結構,但是比xml更小、更快、更簡單,而且能跨語言、跨平臺。你可以把你的資料按你的要求結構化,然後可以轉化成多種資料流,同時其他語言可以通過

Protobuf 序列協議詳解

Protocol Buffers是Google開發一種資料描述語言,能夠將結構化資料序列化,可用於資料儲存、通訊協議等方面。據Google官方文件介紹,現在Google內部已經有48,162個訊息型別定義在12,183個proto檔案中。本文會從快速入門、語言規範、編碼協議、效能評估等幾個方面對Pr

gRPC快速入門(二)——Protobuf序列原理解析

gRPC快速入門(二)——Protobuf序列化原理解析 一、Protobuf序列化原理簡介 1、序列化 序列化是將資料結構或物件轉換成二進位制位元組流的過程。Protobuf對於不同的欄位型別採用不同的編碼方式和資料儲存方式對訊息欄位進行序列化,以確保得到高效緊湊的資料壓縮。Protobuf序列化過程

Fastjson和jackson序列小知識

在使用Fastjson和Jackson對物件進行序列化時,針對物件的get方法進行序列化(即使沒有顯示宣告屬性),不同的工具處理方式也有所不同,比如會處理掉大小寫,下劃線,數字,排序等等,如圖: public class TestClass { public String get2A(

Jackson 列舉序列/反序列

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

Jackson序列問題

JackSon和內部類,是的,你可以使用,但他們必須是靜態的內部類。 這是我直到今天沒有意識到的東西:這顯然是正確使用內部類在Java開發者社群的巨大的困惑。事實上有一些網頁顯示 JackSon不能使用內部類值。 這實際上是真實的和虛假的,原因就在於Java的內部類的特

jackson序列時忽略不需要的欄位

有時候,如果資料庫表中增加一個欄位,但返回的JSON字串中含有我們並不需要的欄位,那麼當對應的實體類中不含有該欄位時,會丟擲一個異常,告訴你有些欄位沒有在實體類中找到。解決辦法很簡單,在宣告ObjectMapper之後,加上上述程式碼: objectMapper.configure(Deserializat

Spring boot 配置jackson序列時間格式、忽略實體中沒有的屬性

需要在繼承自 WebMvcConfigurerAdapter 的類中重寫configureMessageConverters 方法 @Override public void configureM

關於Spring Jackson序列Date時遇到的問題

Jackson對於date的反序列化只支援幾種,如果不符合預設格式則會報一下錯誤 具體支援:("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss

protobuf序列通訊協議

一、概念 protobuf是Google開發的開源專案。protobuf是一種序列化的資料結構資訊,類似xml。主要用於訊息傳輸中訊息格式規範,資料儲存。與xml相比,protobuf更小、更快、更簡單、更少歧義、方便生成訊息存取類。 二、protocol buffer訊息優

Spring Jackson序列Date時遇到的問題

Jackson對於date的反序列化只支援幾種,如果不符合預設格式則會報一下錯誤 org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from

jackson序列複雜泛型物件

最近在使用Redis 快取資料的時候使用的spring 的aop自動從快取中去區json資料。發現方法的返回值帶有泛型時,直接簡單的呼叫使用下面的方法無法拿到正確的結果。 Method method = ((MethodSignature) pjp.getSignature(

Jackson實現序列和反序列

簡介通俗的來說,Jackson是一個 Java 用來處理 JSON 格式資料的類庫,其效能非常好。Jackson具有比較高的序列化和反序列化效率,據測試,無論是哪種形式的轉換,Jackson > Gson > Json-lib,而且Jackson的處理能力甚至高出

Lua 中實現 protobuf 序列,反序列

Protobuf 官方並沒有 Lua版本,然後網易的程式猿開發出了 protoc-gen-lua ,可以讓我們將 Proto 檔案轉成 lua 指令碼在 Lua中使用,下面是詳細的編譯、安裝、使用教程。文中用到的程式碼、工具都有百度網盤下載。 網盤下載地址: http:

protobuf 序列序列介面

包括    C陣列序列化與反序列化 ,檔案描述符序列化與發序列化 ,string類的序列化與反序列化 ,C++ stream 序列化和反序列化 你也可以在/usr/local/include/goo

protobuf序列/反序列效能及問題

為了tensorflow專案要求測試protobuf序列化/反序列化的效能,測試過程及測試結果如下: 一. 測試環境 python 2.7 + proto3 二. 測試方法 1. 自定義一個proto訊息(使用protobuf example裡的例子,進行修改) mes