0

我在使用 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。

4

1 回答 1

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 对象集合中的字段至少是概念/语义不匹配。这不是最糟糕的事情。只要确保它理解它的含义。

于 2012-07-30T01:31:19.107 回答