【问题标题】:GSON fromJson returns nullGSON fromJson 返回 null
【发布时间】:2014-03-24 03:31:14
【问题描述】:

我正在寻找解析 JSON 对象,但在使用 fromJson 时我一直为空。我确定 inputStream 是有效的,看起来阅读器也已初始化和填充,但“响应”不断返回 null,导致致命异常。我期望得到一个包含 3 个字段的“响应”,其中一个是结果类型列表,结果中唯一的字段是名称。我究竟做错了什么?

我正在使用以下代码:

    String url = uribuilder.build().toString();

    try {
        HttpRequest httpRequest = requestFactory.buildGetRequest(new GenericUrl(url));
        HttpResponse httpResponse = httpRequest.execute();
        inputStream = httpResponse.getContent();

    } catch (IOException e) {
        e.printStackTrace();
    }

    Gson gson = new Gson();
    Reader reader = new InputStreamReader(inputStream);
    SearchResponse response = gson.fromJson(reader, SearchResponse.class);
    List<Result> resultList = response.results;

SearchResponse 类:

package com.example.places;

import com.google.gson.annotations.SerializedName;
import java.util.List;

    public class SearchResponse {

        @SerializedName("html_attributions")
        public String html_attributions;

        public List<Result> results;

        @SerializedName("status")
        public String status;

    }

结果类:

package com.example.places;

import com.google.gson.annotations.SerializedName;

    public class Result {

        @SerializedName("name")
        public String name;

    }

这是 JSON inputStream 的一个示例,我已确认正在将其下载到 var inputStream 中。

    "html_attributions" : [],
    "results" : [
    {
    "geometry" : {
    "location" : {
    "lat" : 52.3784713,
    "lng" : 4.629422400000001
    }
    },
    "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png",
    "id" : "426ed4299daa6451e2293b1677e06b524562c547",
    "name" : "Lange Lakenstraat",
    "reference" : "CqQBoAAAANEj46iTeMbRHeUcEGFeaCAMrnHxXvFpadEefjrl4qDBitY4b5c2kjVunQrm496UeU1BHLiflo4tA6z7sDBZw3u0b2oPwTqOSiA1Jf4TZA3J6GeGfo_0tLV5dnHH2a3gJbl7fnDvWdZco2BvP_mgVSJgcC2hnb3H8xf9_HYUKtWjAPiV-lY-TnIeZqJaAaH7rJfg9OuHMjmYVYnYuaW0FoQSEEBP1JORpML1X0D9qgGPl0QaFJhSaAVENN_I4-p8tK-5B790QkwD",
    "types" : [ "route" ],
    "vicinity" : "Oude Stad"
    },
    {
    "geometry" : {
    "location" : {
    "lat" : 52.3812134,
    "lng" : 4.633607599999999
    },
    "viewport" : {
    "northeast" : {
    "lat" : 52.3854271,
    "lng" : 4.644829
    },
    "southwest" : {
    "lat" : 52.375918,
    "lng" : 4.624482899999999
    }
    }
    },
    "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png",
    "id" : "7b7289c46ec49e2de4c7922bb1489f4b7d285385",
    "name" : "Centrum",
    "reference" : "CpQBjQAAAPTn0HELVmsIds40sY_RGXIY1GmrhqlfejMmrQrG2Gl095VujXOugcPR5ZuZ3-aNZhLZEXNsOO_Ghf_0vEnIkjVan11tb1WtDiwJrIfAa31hPt8XlIGY3JBWKXew0qVpGXZbEoHvhThzn-z0OBZ0pqMR5PZrU7mgoH26pbAR_y-Nngo74sQHZs9wO3dzQl34RRIQMvDj3KMrzUBgSf6WVVHzNRoUlDtZh_8FsLn3qaEWzvPnnyFe9j8",
    "types" : [ "sublocality", "political" ],
    "vicinity" : "Centrum"
    }
    ],
    "status" : "OK"
    }

【问题讨论】:

  • 搜索响应应该是 List 结果;或 ArrayList 结果;
  • 您的意思是“List results = response.results;”吗?如果是这样,不幸的是,这没有什么区别。我不确定如何使用 List 结果;在 SearchResponse 行中。
  • 对不起,我写错了。我的意思是在您的 SearchResponse 课程上。
  • 有道理。不幸的是,我仍然得到一个空值。我更新了上面的代码。
  • 试试这个代码:source = new BufferedInputStream((inputStream));阅读器 reader = new InputStreamReader(source); SearchResponse response = gson.fromJson(reader, SearchResponse.class);

标签: android json gson


【解决方案1】:

嗯,很奇怪。在这种情况下,错误来自 SearchResponse 类。如果查看 JSON,第一个字段是

"html_attributions" : [],

所以是一个数组。

在搜索响应中

public String html_attributions;

应该是

public String[] html_attributions;

代码现在显示出生命迹象。为什么它抛出一个空异常而不是预期的“java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY”,我不知道。

【讨论】:

  • 如果有人遇到这种情况,我在将 {"request_id":"a091f9c12e6e431ab3878e1359f0aa21","status":"0"} 转换为状态为 String 的 Java 类时得到了这个,而且它只发生在我将其发布在 Google Play 商店中。我将其更改为 int 并且已修复。陌生且难以调试..
【解决方案2】:

我遇到了类似的问题,但就我而言,我有这个对象:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EmployeeDto {
    @ApiModelProperty(notes = "Crew Id")
    private String crewId;

    @ApiModelProperty(notes = "Employee Role")
    private String employeeRole;

    @ApiModelProperty(notes = "Employee First Name")
    private String firstName;

    @ApiModelProperty(notes = "Employee Last Name")
    private String lastName;
}

这是来自上一个查询的字符串:

{"crewId":"924142","employeeRole":"Manager","firstName":"Hans","lastName":"Miller"}

问题是因为驼峰表示法,所以我将其更改为:

{"crew_id":"924142","employee_role":"Manager","first_name":"Hans","last_name":"Miller"}

根据documentation,可以在 Gson 中定义字段策略:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多