1. 程式人生 > >Gson 反序列化Map型別的小問題

Gson 反序列化Map型別的小問題

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;


/**
 * 
 * @author Dabria_ly
 * 2017年7月13日
 */
public class Test3 {
public static void main(String[] args) throws ParseException {
 Gson gson = new Gson();
Map<String, String> map = new HashMap<String, String>();
map.put("id","12879613");
map.put("name","張三");


Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("id",12879618);
map2.put("num",128);
map2.put("name","李四");

Map<String, Object> map3 = new HashMap<String, Object>();
System.out.println("id序列化後的結果="+gson.toJson("12879619"));
System.out.println("num序列化後的結果="+gson.toJson(12879777));
map3.put("id", gson.toJson("12879619"));
map3.put("name", gson.toJson("王五"));
map3.put("num", gson.toJson(12879777));
map3.put("count", String.valueOf("12879777"));


String mapToStr = JSONObject.toJSONString(map);
Map<String, String> newMap = gson.fromJson(mapToStr, new TypeToken< Map<String, String>  >() {}.getType());

String map2ToStr = JSONObject.toJSONString(map2);
Map<String, Object> newMap2 = gson.fromJson(map2ToStr,new TypeToken< Map<String, Object>  >() {}.getType());


String map3ToStr = JSONObject.toJSONString(map3);
Map<String, Object> newMap3 = gson.fromJson(map3ToStr,new TypeToken< Map<String, Object>  >() {}.getType());

System.out.println("newMap="+newMap);
System.out.println("newMap2="+newMap2);
System.out.println("newMap3="+newMap3);

}

}

------------------------執行結果:-------------------------------

id序列化後的結果="12879619"
num序列化後的結果=12879777
newMap={name=張三, id=12879613}
newMap2={num=128.0, name=李四, id=1.2879618E7}
newMap3={num=12879777, name="王五", count=12879777, id="12879619"}

------------------------------------完畢----------------------------------------------------------

從上面的執行結果可以看出,Gson在反序列Map<String, Object>資料型別時,它沒有正確的反序列我想要的資料。當然想要讓它變成我想要的資料方法有很多:

1.像map3 一樣先呼叫gson序列化一下,然後再反序列(個人覺得這種方法有點小雞肋,然而也覺得這個是目前是最好的方法);

2.像map一樣,將資料型別宣告成Map<String, String>型別(我特別不喜歡將資料型別定義成這樣,別問我為啥,個人習慣咯);

3.定義一個javaBean,將我們的資料轉換成JavaBean物件(親測,可以解決我目前的情況,但是對於一次性資料,我內心是很拒絕去定義一個javaBean物件的,別問我為啥,個人習慣咯).

目前是實際專案中遇到這種問題,所以採用了上述之一的方法來解決。雖然問題是解決的,但我還是有點小糾結為啥Gson反序列化Map<String, Object>失敗,於是就只能去檢視原始碼了,最後在debug原始碼時發現,原始碼執行 T object = typeAdapter.read(reader);到這一句時,將我們的資料改變的,檢視Gson文件,應該是我們用的TypeAdapter是Gson自帶的,它裡沒沒有定義,點原始碼進去看,實在太多,不想看下去了。有不有大神,求賜教,寫一個能反序列化Map<String, Object>資料型別的demo

相關推薦

Gson 序列Map型別問題

import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u

2018-07-25期 Java序列序列編程案例

測試 product set pri get sof serial span not package cn.sjq.Serializable.java;import java.io.FileInputStream;import java.io.FileOutputStrea

Fastjson 序列序列Map物件排序問題(字串轉mapmap轉字串)

背景 記錄專案中遇到的 關於fastjson jsonobject轉string亂序,string轉jsonObject亂序問題的解決方案 fastJson issues 問題來源描述參見: https://github.com/alibaba/fastjson/issues/359

Gson 序列注意點

官方github在這裡 https://github.com/google/gson 當序列化物件中有uri成員時 public class person { private String name; private Uri imagePath; public s

kotlin gson序列預設值失效

Gson反序列化原理 原理簡述 gson反序列化主要分為兩個過程: 根據TypeToken創建出物件 根據json字串解析資料,對物件屬性賦值 物件的建立 ConstructorConstructor.get 先嚐試獲取無參建構函式 失敗則嘗試List、Map等情況的建構函

完全理解Gson(3):Gson序列

本文延續前一篇文章,繼續介紹簡單基本的Gson用法。這篇文章我們將介紹如何將複雜的JSON物件解析為Java物件,其中Java物件的結構可以與JSON物件不一致。我們還會看到如何使用Gson反序列化器(JsonDeserializer Java文件)將JSON物件對映

JSON序列序列匿名型別

一、序列化匿名型別 1.序列化一個var型別 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using Gon

MongoDB中物件序列的一個問題

今天在mongoDB存取物件資料的時候,碰到一個小問題:物件的某一個欄位型別是抽象類或者介面,在存入的時候沒有問題,但是在讀取的時候,由於沒有具體類的資訊,無法完成物件的重新構建,就會報錯: Can not construct instance of com.bp.samp

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

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

Gson 序列導致成員變數宣告時賦值失敗

方法呼叫中一個在宣告時賦值的變數為空,最後測試時發現,語句塊也不會執行,最後確定原因是 Gson 反序列化時會查詢預設建構函式,沒有預設建構函式會呼叫內部 api 例項化資料,導致相關程式碼沒執行。新增一個預設建構函式

GsonMap 巢狀型別序列序列

Gson 對 Map<String, Object>  巢狀型別的序列化與反序列化 gson 簡介: Gson is a Java library that can be used to convert Java Objects into its JSON re

白審計JACKSON序列漏洞

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

反射操作數組---序列知識

tde dcl 寫入 小知識 code bject 數組類 操作數 反序列化 Object[] 為 數據源 model 中有一個屬性為xxx[] 未知,在java中,object[] 無法強制轉化成xxx[],如果上文中的f.set(obj,fieldObj );方法反射

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)

JSON 序列序列(二)使用TypeReference 構建型別安全的異構容器

原文連結:https://www.cnblogs.com/yuyutianxia/p/6051682.html 1. 泛型通常用於集合,如Set和Map等。這樣的用法也就限制了每個容器只能有固定數目的型別引數,一般來說,這也確實是我們想要的。 然而有的時候我們需要更多的靈活性,如資料庫可以用

Go語言基礎(十四)—— Go語言切片,map,結構體與Json的序列序列

序列化和反序列化 序列化概念理解:就是將變數從記憶體中變成可儲存或傳輸的過程稱之為序列化,序列化之後,就可以把序列化後的內容寫入磁碟,或者通過網路傳輸到別的機器上。 反序列化則就是序列化反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化 序列化結構體案例: packa

【修真院java課堂】什麼是序列序列,在RMI中是否要實現 SERIALIZABLE 介面, SERIALVERSIONUID的用處是什麼?

8.更多討論 1、serialVersionUID實際作用 假設本地資料庫中儲存了大量的user物件,後來由於需求,要修改User類中的屬性;如果不設定SerialVersionUID,根據屬性方法等自動生成,就會出現程式碼演示中的錯誤,造

fastjson、gson、jackson序列序列效能對比

注:相關依賴 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId

Gson教程二(譯):巢狀物件的序列序列

該文章翻譯自Gson Tutorial Series系列教程。該篇主要闡述瞭如何使用Gson對映巢狀類。 巢狀物件的序列化 我們希望通過實際的例子來闡述功能,因此讓我們來擴充套件我們的UserSimple模型。在之前的釋出中,user模型僅僅有一

GSON使用筆記(3) -- 如何序列出List

本文通過3個問題來討論如何使用GSON把JSON反序列化為List。 問題1 有這樣兩個類: class MyObj { int x; } class MyList { List<MyObj> objList = new LinkedList