gson Json反序列化用于异种类型的Json Java

sgtfey8w  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(150)

提前道歉,我对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。例如:Map〈字符串,医院〉城市医院Map。class医院{字符串医院名称;整数密码;}
但是如何编写解串器?尝试

JsonObject allcities = (JsonObject) json.get("result");
City cities = new Gson().fromJson(allcities,City.class);

但是城市并不包含任何数据。

Result:
cities{pincode=null}
vatpfxk5

vatpfxk51#

已编辑,因为您在JSON中添加了result。此处的问题(编辑后)是,您声明的City不包含,但它本身Map<String, Map<String,Hospital>>

首先,需要一个“ Package 器”类,比如Data,因为JSON示例中有一个包含Response的对象,而Response又包含City对于City,没有固定的字段名,因此需要将其反序列化为Map

这同样适用于MapCity中的值City中的值也是Map的类型让我们称这些值为内部Map。因为有一个固定的字段名pincode,所以您可以在此内部Map中将前面提到的值声明为Hospital类型,从而生成如下所示的类:

@Getter @Setter
public class Data {
    @Getter @Setter
    public class Result {
        private Map<String, 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, Map<String, Hospital>> city = data.getResult().getCity();

得到400002
您可以实现一些或多或少复杂的自定义反序列化器,但如果需要,反序列化JSON并在此之后Map到其他类型的类可能会更容易。

相关问题