0

JSON を GSON で解析する際に問題があります。

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 になります。それ以上...

元の質問の現在の逆シリアル化コードには 2 つの基本的な問題があります。

まず、JSON 要素名が Java フィールド名と一致しないため、JSON 要素を Java フィールドにマッピングする追加の構成情報がなければ、Gson は逆シリアル化中に自動的にデータバインドできません。Java フィールド名が JSON 要素名と正確に一致する場合、そのような追加の構成は必要ありません。以下の例では、@SerializedNameアノテーションを使用して、欠落している名前マッピングを提供しています。

第 2 に、JSON データ構造は Java データ構造と完全に (十分に) 一致しません。JSON には「データ」オブジェクトのコレクションが含まれますが、Java データ構造は「データ」オブジェクトを 1 つしか想定していません。これを修正する簡単な方法は、JSON に一致するように Java 構造を変更し、「データ」オブジェクトのコレクション (リストまたは配列) を想定することです。これを以下の例で示します。(あるいは、単純なカスタム逆シリアル化処理を使用して、(1 つのコンポーネントの) 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 に答える