2

私はJSONが初めてで、フォローされたJSON入力のPOJOの作成に問題があります。

    [
    {
"score":1,
"popularity":3,
"name":"Brad Pitt",
"id":287,
"biography":"test",
"url":"http://www.themoviedb.org/person/287",
"profile":[
    {
        "image":{
            "type":"profile",
            "size":"thumb",
            "height":68,
            "width":45,
            "url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w45/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
            "id":"4ea5cb8c2c0588394800006f"
        }
    },
    {
        "image":{
            "type":"profile",
            "size":"profile",
            "height":281,
            "width":185,
            "url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w185/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
            "id":"4ea5cb8c2c0588394800006f"
        }
    },
    {
        "image":{
            "type":"profile",
            "size":"h632",
            "height":632,
            "width":416,
            "url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/h632/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
            "id":"4ea5cb8c2c0588394800006f"
        }
    },
    {
        "image":{
            "type":"profile",
            "size":"original",
            "height":1969,
            "width":1295,
            "url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/original/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
            "id":"4ea5cb8c2c0588394800006f"
        }
    }
],
"version":685,
"last_modified_at":"2013-02-16 07:11:15 UTC"
  }
  ]

私は 3 つの POJO を作成しました。そのうちの 1 つはメインの人物クラスであり、これにはプロファイル オブジェクトも含まれています。Profile オブジェクトは画像リストを返します。:

    public class Person implements Serializable {

  private static final long serialVersionUID = 6794898677027141412L;

  public String biography;
  public String id;
  public String last_modified_at;
  public String name;
  public String popularity;
  public String score;
  public String url;
  public String version;
  public ArrayList<Profile> profile;

  //getters and setters
    }

    public class Profile implements Serializable {

  private static final long serialVersionUID = -6482559829789740926L;

  public ArrayList<Image> image;

    }


    public class Image implements Serializable {

    private static final long serialVersionUID = -2428562977284114465L;

    public String type;
    public String url;
    public String size;
    public int width;
    public int height;
    }

データを取得するには、gson を使用しています:

  Gson gson = new Gson();
  Type collectionType = new TypeToken<List<Person>>(){}.getType();
  List<Person> details = gson.fromJson(json, collectionType);

これを実行すると、次のようになりました。

  02-17 11:04:50.531: E/AndroidRuntime(405): Caused by:  com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 3

更新された画像 POJO:

public class Image implements Serializable {

private static final long serialVersionUID = -2428562977284114465L;
private Object image;

public class ImageInner {

    public static final String SIZE_ORIGINAL = "original";
    public static final String SIZE_MID = "mid";
    public static final String SIZE_COVER = "cover";
    public static final String SIZE_THUMB = "thumb";
    public static final String TYPE_PROFILE = "profile";
    public static final String TYPE_POSTER = "poster";
    public String type;
    public String url;
    public String size;
    public int width;
    public int height;

}
}

ありがとうございました

4

1 に答える 1

1

あなたのコードは実際には非常に近く、2 つのエラーがあります。

1) 受け取ったエラーは、JSON の最初で配列 ( [) の開始を予期していたが、代わりにオブジェクト ( {) の開始を取得したことを示しています。投稿した JSON は、Gson に与えているものではありません(以下を参照)。

2) 上記を修正すると、PersonPOJOに小さな問題が 1 つあります。

public ArrayList<Profile> profile;

次のようにする必要があります。

public ArrayList<Image> profile;

Profile実際にはクラスは必要ありません。profileJSONでは配列です。Profileオブジェクトの ArrayList を予期しているため、現在受け取っているものと同様の別のエラーをそのまま受け取ることになります。"profile":[{"image":[{imageobject},...]},{"image":[{imageobject},...]}]

2 番目を修正して、投稿した JSON を Gson にフィードすると、完全に機能します。オブジェクトの配列を投稿しましたPersonが、コード ( ) に実際にあるのは、json1 つのオブジェクトか、投稿した配列を含むオブジェクトのいずれかです。Person以下の小さな例は完全に機能します (クラスを修正した後):

public class App
{
        static String json = "[{\"score\":1,\"popularity\":3,\"name\":\"Brad Pitt\",\"id\":287," +
        "\"biography\":\"test\",\"url\":\"http://www.themoviedb.org/person/287\",\"profile\":" +
        "[{\"image\":{\"type\":\"profile\",\"size\":\"thumb\",\"height\":68,\"width\":45,\"url\":" +
        "\"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w45/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg\"," +
        "\"id\":\"4ea5cb8c2c0588394800006f\"}},{\"image\":{\"type\":\"profile\",\"size\":\"profile\"," +
        "\"height\":281,\"width\":185,\"url\":\"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w185/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg\"," +
        "\"id\":\"4ea5cb8c2c0588394800006f\"}},{\"image\":{\"type\":\"profile\",\"size\":\"h632\",\"height\":632,\"width\":416,"+
        "\"url\":\"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/h632/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg\"," +
        "\"id\":\"4ea5cb8c2c0588394800006f\"}},{\"image\":{\"type\":\"profile\",\"size\":\"original\",\"height\":1969," +
        "\"width\":1295,\"url\":\"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/original/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg\"," +
        "\"id\":\"4ea5cb8c2c0588394800006f\"}}],\"version\":685,\"last_modified_at\":\"2013-02-16 07:11:15 UTC\"" +
        "}]";

    public static void main(String[] args)
    {

        Gson gson = new Gson();
        Type collectionType = new TypeToken<List<Person>>(){}.getType();
        List<Person> details = gson.fromJson(json, collectionType);
    }
}

追加する編集:実際には、Gsonが処理しているいくつかの型変換が行われています...しかし、あなたは本当に望んでいないかもしれません. たとえば、JSONscoreは ですintが、POJO ではString. Gson は黙って変換を行います。

また、上記のように SSCCE ( http://sscce.org/ ) を作成するだけでも、これらの問題をデバッグするのに役立ちます。

于 2013-02-17T22:00:52.323 に答える