我正在尝试将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"
}
}
}
这里数字1
,2
是动态的,可以达到任意数字,我试图创建一个外部对象,并且键入一个键类型为String的字符串,并将值作为对象TableData。地图具有变量名TABLE_Detail
。但TableData对象始终为null。 TableData对象具有所有变量。
请帮我讲解如何将这个json字符串转换为对象。
答案 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结构。
使用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);
}
...
}
编写自己的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"
}
]
}