问题描述
提前道歉,我对JSON解析有点陌生,并且在用Java在Object中解析JSON时遇到了问题。
{ result: {
"City": {
"Delhi": {
"A-Hospital": {
"pincode": 400001
},"B-Hospital": {
"pincode": 400002
},"C-Hospital": {
"pincode": 400003
},.
.
.
},"Mumbai": {
"A-Hospital": {
"pincode": 500001
},"B-Hospital": {
"pincode": 500002
},"C-Hospital": {
"pincode": 500003
},"Bangalore": {
"A-Hospital": {
"pincode": 600001
},"B-Hospital": {
"pincode": 600002
},"C-Hospital": {
"pincode": 600003
},"D-Hospital": {
"pincode": 600004
},.
.
.
}
}
}
}
接收Json是从第三人那里接收的,因此无法格式化。 如何为这种动态json创建类结构并解析为Object?
class City{
private Map<String,Map<String,Hospital>> hours;
//Getter and Setter
}
class Hospital {
private String pincode;
//Getter and Setter
}
我想以医院(A医院,B医院等)为对象形成城市地图。示例:Map
但是如何编写反序列化器? 试过
JsonObject allcities = (JsonObject) json.get("result");
City cities = new Gson().fromJson(allcities,City.class);
但是城市不包含任何数据。
Result:
cities{pincode=null}
解决方法
已编辑,因为您在JSON中添加了result
。您的问题-经过修改后-您声明的City
不包含但它本身是 IS 一个Map<String,Map<String,Hospital>>
。
首先,您需要一个“包装”类,例如Data
。这是因为您的JSON示例包含一个包含Response
的对象,其中包含City
。
对于City
,没有固定的字段名称,因此您需要将其反序列化为Map
。
这同样适用于地图City
中保存的值。 City
中的值也是Map
的类型,我们将这些值称为内部映射。由于存在一个固定的字段名称pincode
,因此您可以在此内部映射中声明类型为Hospital
的之前提到的值,从而导致类似以下的类:
@Getter @Setter
public class Data {
@Getter @Setter
public class Result {
private Map<String,Hospital>> City;
@Getter @Setter
public class Hospital {
private String pincode;
}
}
private Result result;
}
现在,如果您使用上面的此类与Gson反序列化,则可以像这样使用它:
Data data = gson.fromJson(JSON,Data.class);
Map<String,Hospital>> city = data.getResult().getCity();
并获得400002
。
您可以实现某种或多或少复杂的自定义反序列化器,但也许反序列化JSON更容易,并且在需要时可以映射到其他类型的类。