我从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时:
它看起来如下:
为什么它将10个Null值分配到我的数组中?
这是不正确的!
答案 0 :(得分:1)
您需要覆盖toString()
中的UserSite
,
@Override
public String toString() {
return String.format("siteId = %d, siteName = %s", SiteId, SiteName);
}
此外,您的字段应为private
,Java命名约定为siteId
和siteName
。默认情况下,您可以使用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
。