使用GSON解析为POJO时包含10个额外null元素的数组

时间:2014-08-21 19:22:41

标签: java android json gson pojo

我从web api收到一个Json对象,

它看起来如下:

{"Sites":[{"SiteId":1,"SiteName":"Site 1"},{"SiteId":2,"SiteName":"Site 2"},{"SiteId":3,"SiteName":"Site 3"}]}

现在我有以下代码使用gson将其解析为POJO:

@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
    try {
        String json = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));
        return Response.success(gson.fromJson(json, clazz),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
}

这是我的POJO:

 public class UsersSitesViewModel 
 {
     public List<UserSite> Sites;
 }

public class UserSite {

 public UserSite(int siteId, String siteName) 
 {
    SiteId = siteId;
    SiteName = siteName;
 }

 public int SiteId;
 public String SiteName;
}

但现在当我运行我的代码并调试以查看它创建的pojo时:

它看起来如下:

View of instantiated POJO

为什么它将10个Null值分配到我的数组中?

这是不正确的!

3 个答案:

答案 0 :(得分:1)

您需要覆盖toString()中的UserSite

@Override
public String toString() {
  return String.format("siteId = %d, siteName = %s", SiteId, SiteName);
}

此外,您的字段应为private,Java命名约定为siteIdsiteName。默认情况下,您可以使用Object.toString()和每个Javadoc,

  

toString的{​​{1}}方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@&#39;”和无符号字符组成。对象哈希码的十六进制表示。换句话说,此方法返回一个等于值的字符串:

Object

答案 1 :(得分:1)

它对我来说很好。

UsersSitesViewModel data = new Gson().fromJson(json, UsersSitesViewModel.class);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));

要遵循Java命名约定,请使用@SerializedName注释

class UsersSitesViewModel {
    @SerializedName("Sites")
    private List<UserSite> sites;
    // getter & setter
}

class UserSite {

    @SerializedName("SiteId")
    private int siteId;
    @SerializedName("SiteName")
    private String siteName;
    // getter & setter
}

您可以将其转换为Map<String,Object>仅用于调试目的

Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> data = new Gson().fromJson(json, type);

输出:

{
  "Sites": [
    {
      "SiteId": 1.0,
      "SiteName": "Site 1"
    },
    {
      "SiteId": 2.0,
      "SiteName": "Site 2"
    },
    {
      "SiteId": 3.0,
      "SiteName": "Site 3"
    }
  ]
}

答案 2 :(得分:1)

您看到十个空值的原因是由于数组列表的工作方式。数组列表本质上是向量,或类似数组的行为,但会自动调整大小。为防止在向量(和ArrayLists)周围存储额外的内存,通常会使用额外的内存来创建。由于复制内存所需的时间大于开始时分配内存所需的时间,因此大多数实现只是在开始时分配额外的空间。

我们可以通过ArrayList中的size属性来判断这是发生了什么。 size列为3,这是数组列表中正确的元素数。因此,当您查询数组列表的长度时,您将获得3