使用GSON解析JSON,类问题

时间:2012-07-30 00:49:15

标签: java json gson

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

1 个答案:

答案 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对象集合中的字段至少是概念/语义不匹配。这不是最糟糕的事情。请确保理解它意味着什么。