2013-11-22 42 views
1

地圖反序列化JSON對象我在網上搜索了一個解決方案,但是,問題的答案時,正在分析的JSON文件僅僅是一個地圖我發現只有幫助。有使用GSON

我想知道是否有辦法解析具有HashMap以及其他數據的對象。

例如:

public class Data 
{ 
    String aName; 
    HashMap<String, Object> objects; 
    List<String> aExpressions; 
} 

我可以解析名稱和表達式,但我不知道如何解析整個JSON對象作爲一個整體。

我認爲它與類型標記有關,但只適用於整個對象是HashMap

+0

你認爲JSON是什麼?它是使用標準符號將列表和地圖和字符串和數字放在一起。只要您的List或Map包含(遞歸)只列表,地圖,字符串,布爾值和數字(以及任何您用於NULL),它很容易被轉換成JSON。 –

+0

(您在Java中遇到的一個問題是標準的Java JSON工具包模糊了符號的簡單性。) –

回答

1

你的類中HashMap的存在並不會改變Gson如何將它轉換爲json。

data d = new data(); 
//set some values 

String json = new Gson().toJson(d); 
data d2 = new Gson().fromJson(json, data.class); 

這幾乎就是它。

+1

+1。作爲對OP的補充讀物:[如何將Java對象轉換爲JSON(Gson)] /(從http://www.sonyericsson.com/java/how-do-convert-java-object-to-from-json -format-GSON-API /) – informatik01

1

Since

JSON可以表示四個基本類型(字符串,數字, 布爾值和零)和兩個結構化類型(對象和數組)。

一個字符串是一個零個或多個Unicode字符序列 [UNICODE]。

一個目的是零個或多個名稱/值
對,其中一個名稱是字符串的無序集合和一個值是一個字符串,號碼,
布爾值,null,對象或數組。

數組是零個或多個值的有序序列。

GSON動作2種方式:

  1. 可以讓GSON反序列化創建地圖,列表和原語或
  2. 您可以指定正是那種你想要的對象的組合,並通過反思,它將填滿所需的領域。

你可以混合使用這兩種方法,當然你可以做更多的事情來解決所有的解析案例(比如使用自定義類型適配器)。

我準備您在使用類一個小例子,顯示瞭如何GSON可以使用地圖/表/圖元的組合,或者通過你的類(具有混合的方法)分析數據。

package stackoverflow.questions; 

import java.util.*; 

import com.google.gson.Gson; 

public class Q20154323 { 

    public static class Data { 
     public String aName; 
     public HashMap<String, Object> objects; 
     public List<String> aExpressions; 

     @Override 
     public String toString() { 
     return "Data [aName=" + aName + ", objects=" + objects + ", aExpressions=" + aExpressions + "]"; 
     } 

    } 

    public static void main(String[] args) { 

     Data d = new Data(); 
     d.aName = "Test"; 
     d.objects = new HashMap<>(); 
     d.aExpressions = new ArrayList<>(); 

     d.objects.put("key1", 1L); 
     d.objects.put("key2", new Date()); 
     d.aExpressions.add("Stack"); 
     d.aExpressions.add("Overflow"); 

     Gson g = new Gson(); 
     String json = g.toJson(d); 
     System.out.println("As JSON: " +json); 

     Data d2 = g.fromJson(json, Data.class); 
     System.out.println("As \"casted\" data type: " + d2); 

     Object o3 = g.fromJson(json, Object.class); 
     System.out.println("As \"free\" object: " + o3); 

    } 

} 

這就是執行。它向您展示瞭解析我使用初始類創建的JSON字符串的兩種方式。

As JSON: {"aName":"Test","objects":{"key2":"Nov 23, 2013 1:33:23 AM","key1":1},"aExpressions":["Stack","Overflow"]} 
As "casted" data type: Data [aName=Test, objects={key2=Nov 23, 2013 1:33:23 AM, key1=1.0}, aExpressions=[Stack, Overflow]] 
As "free" object: {aName=Test, objects={key2=Nov 23, 2013 1:33:23 AM, key1=1.0}, aExpressions=[Stack, Overflow]} 

您可以根據需要使用一種或其他方法。

關於TypeToken,由於仿製藥擦除,這樣的事情

List<Data> list = new Gson().parse(aJsonString, List<Data>.class) 

將無法​​正常工作,你必須做一些像

Type listType = new TypeToken<List<Data>>() {}.getType(); 
    List<Data> list = new Gson().parse(aJsonString, listType.class) 

,但這種情況下適用,pratically,當你的JSON是一個數組,您想將其反序列化爲自定義類的列表。