Json Deserialize用于异型json Java

问题描述

提前道歉,我对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 cityHospitalMapping。类Hospital {字符串HospitalName;整数密码}

但是如何编写反序列化器? 试过

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更容易,并且在需要时可以映射到其他类型的类。