[英]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"
}
}
}
在这里,数字1
, 2
是动态的,可以去到任何数字,我试图创建一个外部对象,有一个地图类型密钥字符串和值对象资料表的。 具有变量名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结构,您有两种选择。
使用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); } ... }
编写自己的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.