Java 使用Gson将json转换为列表

Java 使用Gson将json转换为列表,java,gson,Java,Gson,我有一个Json,如下所示: { "searchResults": { "searchCriteria": { "location": { "originalLocation": null }, "startAndEndDate": { "start": "2016-10-06T00:00:00", "end": "2016-10-09T00:00:00" }, "solution": [ { "resultID": "O1MDc1MD",

我有一个Json,如下所示:

{
 "searchResults": {
"searchCriteria": {
  "location": {
    "originalLocation": null
  },
  "startAndEndDate": {
    "start": "2016-10-06T00:00:00",
    "end": "2016-10-09T00:00:00"
  },

"solution": [
  {
    "resultID": "O1MDc1MD",
    "selected": false,
    "charges": {
      "localCurrencyCode": "USD",
      "averagePricePerNight": 153
    },
    "starRating": 3.5
  },
  {
    "resultID": "0MDc1MD",
    "selected": false,
    "charges": {
      "localCurrencyCode": "USD",
      "averagePricePerNight": 153
    },
    "starRating": 3.5
  }
  ....
我有一个属性为Starting和averagePricePerNight的班级,基本上形成了我的POJO

class ResponseModel {
 Int starRating;  Int averagePricePerNight
}
我想解析此JSON并返回一个包含以下内容的列表:

List(ResponseModel(3.5,900), ResponseModel(3.5,100), ResponseModel(4.5,1000))

我试图以列表的形式获取json,但是找不到从json获取两个元素的示例。

您可以编写一个自定义反序列化程序:

class Deserializers {
     public static ResponseModel responseModelDeserializer(JsonElement json, Type typeOfT,
        JsonDeserializationContext context) {

        JsonObject obj1 = json.getAsJsonObject();
        JsonObject obj2 = obj1.get("charges").getAsJsonObject();

        double starRating = obj1.get("starRating").getAsDouble();
        int averagePricePerNight = obj2.get("averagePricePerNight").getAsInt();

        return new ResponseModel(starRating, averagePricePerNight);
    }
}
在构建
Gson
时注册它:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(ResponseModel.class,
        (JsonDeserializer<ResponseModel>) Deserializers::responseModelDeserializer
        // ^^^ Cast is needed because the parameter has type Object
    )
    .create();

因为在您的示例中它似乎是一个,所以我将
starRating
a
double

首先,您的POJO不是有效的Java。其次,你还没有表现出你尝试过任何东西,那么我们为什么要帮助你呢?@rmlan:刚从scala出来,所以在这里写课程时错过了它。我试着获取数据,但要么我可以获得星号,要么平均价格每晚,我无法获得两者。这仍然不是Java代码。如果你的JSON是有效的,那么提供答案会更容易。也许你应该试试这个网站:
// Get root json object
JsonObject root = new JsonParser().parse(input).getAsJsonObject();

Type tt = new TypeToken<List<ResponseModel>>() {}.getType();
// Get array
List<ResponseModel> mo = gson.fromJson(root.get("solution"), tt);

System.out.println(mo); // [3.5 : 153, 3.5 : 153]
class ResponseModel {
    private final double starRating;
    private final int averagePricePerNight;

    public ResponseModel(double starRating, int averagePricePerNight) {
        this.starRating = starRating;
        this.averagePricePerNight = averagePricePerNight;
    }

    @Override
    public String toString() {
        return String.format("%s : %s", starRating, averagePricePerNight);
    }
}