2017-03-20 28 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