通过GSON将json字符串转换为对象

时间:2017-03-20 07:44:01

标签: java json string rest 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是动态的,可以达到任意数字,我试图创建一个外部对象,并且键入一个键类型为String的字符串,并将值作为对象TableData。地图具有变量名TABLE_Detail。但TableData对象始终为null。 TableData对象具有所有变量。

请帮我讲解如何将这个json字符串转换为对象。

5 个答案:

答案 0 :(得分:1)

将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
}

答案 1 :(得分: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());
}

答案 2 :(得分:1)

使用Gson时,你有两种选择这种痛苦的json结构。

  1. 使用Gson解析json作为Map并写一些类访问返回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,但这种方式可能会更复杂。如果您对编写自定义TypeAdapter感兴趣,我会为解压缩json root编写一个演示。gson-enclosing-plugin

答案 3 :(得分:0)

我正在寻找解决方案,我遇到了解决方案工作的网站之一。我想归功于以下网站。感谢所有的支持。

我能够将动态值1,2映射为映射键,并使用@SerializedName gson annootation相应地映射到TableData对象属性。

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

答案 4 :(得分:-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"
    }
  ]
}