2017-03-20 116 views
1

我想解析一個json字符串到java對象,但我不確定對象層次結構。通過GSON將json字符串轉換爲對象

下面

是JSON字符串

{ 
    "TABLE_Detail":{ 
     "1":{ 
     "TABLE":"table1", 
     "RUN_DATE":"20170313", 
     "SEQ_NUM":"123", 
     "START_TIME":"20170313133144", 
     "END_TIME":"20170313133655" 
     }, 
     "2":{ 
     "TABLE":"table2", 
     "RUN_DATE":"20170313", 
     "SEQ_NUM":"123", 
     "START_TIME":"20170313133142", 
     "END_TIME":"20170313133723" 
     } 
    } 
} 

這裏數12是動態的,可以去到任何數字,我試圖創建一個外部對象,有一個地圖類型密鑰字符串和值的對象TableData。地圖變量名稱爲TABLE_Detail。但TableData對象始終爲空。 TableData對象具有所有變量。

請幫助我如何將此json字符串轉換爲對象。

+0

您沒有顯示任何代碼。我們應該怎麼知道'TableData'是什麼? – shmosel

回答

-1

當使用JSON陣列需要使用[用於打開和用於關閉

{ 
    "TABLE_Detail": [ 
    { 
     "TABLE": "table1", 
     "RUN_DATE": "20170313", 
     "SEQ_NUM": "123", 
     "START_TIME": "20170313133144", 
     "END_TIME": "20170313133655" 
    }, 
    { 
     "TABLE": "table2", 
     "RUN_DATE": "20170313", 
     "SEQ_NUM": "123", 
     "START_TIME": "20170313133142", 
     "END_TIME": "20170313133723" 
    } 
    ] 
} 
+0

嗨,沒有JSON響應不包含數組括號。響應與我在查詢中給出的相同。 – sriramdev

+0

爲什麼downvote?使用動態列表將永遠解決這個json結構。否則,你不會使用動態列表。 –

1

變化1到表1和2以表2:

public class TableDetails { 
    private TableData table1; 

    private TableData table2; 

    public TableDetails(){ 

    } 

    // getter and setter 
} 

如果修改JSON格式到「公園範Looveren」 中提到:

public class TableDetails { 
    List<TableData> tables; 

    public TableDetails() { 
    } 
    // getter and setter 
} 

表類: Table.java:

public class TableData { 
    private String table; 

    private String run_date; 

    private String seq_num; 

    private String start_time; 

    private String end_time; 

    public TableData() { 
    } 

    // getter and setter 
} 
+0

您好,回覆來自舊服務,恐怕他們可能不會改變他們的迴應結構。有沒有一種方法可以從我這邊消耗響應。請建議。 – sriramdev

+0

如果你不改變json格式,你可以使用TableDetails的第一種形式,我只需將變量名稱從1改爲table1和2即可。但1和2是相同的對象類型,最好使用列表。 –

1

您可以嘗試將其反序列化爲Map<String, Map<String, TableData>>Map<String, TableData>不起作用的原因是pesudo數組被包裝在另一個對象中。

下面的示例轉換的響應到List<TableData>

public List<TableData> deserialize(String json) { 
    return Gson().<Map<String, Map<String, TableData>>>fromJson(json, new TypeToken<Map<String, Map<String, TableData>>>(){}.getType()) 
     .values().iterator().next() 
     .entrySet().stream() 
     .sorted(Comparator.comparingInt(e -> Integer.parseInt(e.getKey()))) 
     .map(Map.Entry::getValue) 
     .collect(Collectors.toList()); 
} 
1

您使用GSON當有兩個選擇用於這種痛苦JSON結構。

  1. 使用Gson解析json作爲地圖並寫入一些類訪問返回Map.this模式對於僅訪問數據正常工作!

    //usage 
    TableDetails details=new TableDetails(gson.fromJson(json, Map.class)); 
    
    //classes 
    class TableDetails { 
        private Map<String, Map> context; 
    
        public TableDetails(Map root) { 
         this.context = (Map<String, Map>) root.get("TABLE_Detail"); 
        } 
    
        public int size() { 
         return context.size(); 
        } 
    
    
        public Table get(String key) { 
         return new Table(context.get(key)); 
        } 
    } 
    
    class Table { 
    
        private Map context; 
    
        public Table(Map context) { 
         this.context = context; 
        } 
    
        public String getName() { 
         return get("TABLE"); 
        } 
    
        private <T> T get(String name) { 
         return (T) context.get(name); 
        } 
        ... 
    } 
    
  2. 寫自己GSON TypeAdapter,但這種方式可能更complex.if你寫定製有趣TypeAdapter有,我爲提取JSON根寫了一個演示。 gson-enclosing-plugin

相關問題