簡體   English   中英

通過GSON將json字符串轉換為對象

[英]converting json string to object through GSON

我正在嘗試將json字符串解析為java對象,但是我不確定對象的層次結構。

下面是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是動態的,可以去到任何數字,我試圖創建一個外部對象,有一個地圖類型密鑰字符串和值對象資料表的。 具有變量名TABLE_Detail的映射。 但是TableData對象始終為null。 TableData對象具有所有變量。

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

將1更改為table1,將2更改為table2:

public class TableDetails {
    private TableData table1;

    private TableData table2;

    public TableDetails(){

    }

    // getter and setter
}

如果將json格式修改為“ Koen Van 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
}

您可以嘗試將其反序列化為Map<String, Map<String, TableData>> 偽數組包裝在另一個對象中的原因Map<String, TableData>不能正常工作。

以下示例將響應轉換為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());
}

使用Gson時,對於這樣痛苦的json結構,您有兩種選擇。

  1. 使用Gson將json解析為Map並編寫一些類訪問返回的Map。此模式僅適用於訪問數據!

     //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,但這種方式可能會更復雜。如果您對編寫自定義TypeAdapter感興趣,則有一個我為提取json根而編寫的演示。 GSON-包圍-插件

我在尋找解決方案時,遇到了該解決方案起作用的站點之一。 我想歸功於以下網站。 感謝所有的支持。

我可以映射動態值1、2,因為映射鍵和值使用@SerializedName gson注釋對應地映射到TableData對象屬性。

http://findnerd.com/list/view/Parse-Json-Object-with-dynamic-keys-using-Gson-/24094/

在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"
    }
  ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM