我在使用GSON解析JSON时遇到问题。
JSON:
{ "data" : [ { "agent" : "Something",
"browser" : "app_j2me",
"campaign" : [ { "banner_type" : "mweb",
"campaign_type" : "cpc",
"cid" : "3",
"contentid" : "49fee4",
"ecpm" : "0.0804"
},
{ "banner_type" : "mweb",
"campaign_type" : "cpc",
"cid" : "22",
"contentid" : "1234",
"ecpm" : "0.1"
}
],
"cntr" : "th",
"imgsize" : "216x36",
"ip" : "123.123.123.123",
"partnerid" : 8959,
"url_click" : "...",
"url_img" : "...",
"url_show" : "...",
"version" : "2"
} ],
"error" : null
}
Java部分:
Gson gson = new Gson();
Json j = gson.fromJson(res, Json.class);
System.out.println(j);
类:
class Json {
public Data d;
public Error r;
public String toString() {
return "Json [url_click=" + d.url_click
+ ", url_img=" + d.url_img
+ ", url_show=" + d.url_show
+ ", imgsize=" + d.imgsize
+ ", cntr=" + d.cntr
+ ", ip=" + d.ip
+ ", version=" + d.version + "]";
}
}
class Data {
public static String url_click;
public String url_img;
public String url_show;
public String imgsize;
public String cntr;
public String ip;
public String version;
public String browser;
public String agent;
public List<Campaign> campaign;
public String toString() {
return "Data [url_click=" + url_click
+ ", url_img=" + url_img
+ ", url_show=" + url_show
+ ", imgsize=" + imgsize
+ ", cntr=" + cntr
+ ", ip=" + ip
+ ", version=" + version + "]";
}
}
class Campaign {
public String banner_type;
public String campaign_type;
public String cid;
public String contentid;
public String ecpm;
}
class Error {
public String error;
}
运行此代码的结果:
Json [url_click=null, url_img=null, url_show=null, imgsize=null, cntr=null, ip=null, version=null]
我认为这是课程的问题,但现在想知道如何让它正常工作。 GSON的版本为2.2.2,Java 1.6。
答案 0 :(得分:2)
如原始问题所示,代码导致NullPointerException。除此之外......
原始问题中当前反序列化代码存在两个基本问题:
首先,JSON元素名称与Java字段名称不匹配,因此Gson在反序列化期间无法自动数据绑定,无需其他配置信息 - 将JSON元素映射到Java字段。如果Java字段名称与JSON元素名称完全匹配,则不需要这样的附加配置。下面的示例使用@SerializedName
注释来提供缺少的名称映射。
其次,JSON数据结构与Java数据结构不完全匹配。 JSON包含一组“数据”对象,而Java数据结构只需要一个“数据”对象。解决此问题的一种简单方法是仅更改Java结构以匹配JSON,并期望“数据”对象的集合(列表或数组),以下示例演示。 (或者,可以使用简单的自定义反序列化处理将JSON集合(一个组件)绑定到不是集合的Java字段。)
import java.io.FileReader;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
public class GsonFoo
{
public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
Json j = gson.fromJson(new FileReader("input.json"), Json.class);
System.out.println(gson.toJson(j));
}
}
class Json
{
@SerializedName("data")
public List<Data> d;
@SerializedName("error")
public Error r;
}
class Data
{
public static String url_click;
public String url_img;
public String url_show;
public String imgsize;
public String cntr;
public String ip;
public String version;
public String browser;
public String agent;
public List<Campaign> campaign;
}
class Campaign
{
public String banner_type;
public String campaign_type;
public String cid;
public String contentid;
public String ecpm;
}
class Error
{
public String error;
}
另外,请注意,将静态Java成员映射到JSON对象集合中的字段至少是概念/语义不匹配。这不是最糟糕的事情。请确保理解它意味着什么。