1

Androidプログラミングを始めたばかりで、imdb APIを使用して素敵なチュートリアルを見つけました。このチュートリアルで xml を使用する代わりに、json を使用したいと思います。受け取った json には問題があります。これは person.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"
}
]

彼らに対する私の2つの反対:

    public class Person implements Serializable {

   private static final long serialVersionUID = 6794898677027141412L;

   public String score;
   public String popularity;
   public String name;
   public String id;
   public String biography;
   public String url;
   public String version;
   public String lastModifiedAt;
   public Profile profile;
    }

    public class Profile implements Serializable {

   private static final long serialVersionUID = -8735669377345509929L;

   public ArrayList<Image> imagesList;

    }

    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;   
    }

ジャクソン オブジェクト マッパーを使用して人物リストを取得する方法がわかりませんでした。私がこれを使用するとき:

    ObjectMapper mapper = new ObjectMapper();
    Person person= mapper.readValue(jsonResponseString, Person.class);

私は得た:

02-16 18:34:48.010: W/System.err(376): com.fasterxml.jackson.databind.JsonMappingException: com.example.imdbsearcher.model.Person のインスタンスを START_ARRAY トークンから逆シリアル化できません 02-16 18 :34:48.180: W/System.err(376): [ソース: java.io.StringReader@40a81778; 行: 1、列: 1] 02-16 18:34:48.554: W/System.err(376): com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:599) 02-16 18: 34:48.830: W/System.err(376): com.fasterxml.jackson.databind.DeserializationContext.mappingException (DeserializationContext.java:593) で

Keith と crdnilfan のアドバイスで取得方法を変更しました。しかし今、プロファイルの属性に問題があります。

私はその個人オブジェクトが欠けていることに気付きました。基本的に、新しいプロファイル オブジェクトを作成し、imageList をこのクラスに移動しました。

上記のようにPOJOを更新しました。

しかし今、プロファイルで同じエラーが発生しています。

START_ARRAY トークンから com.example.imdbsearcher.model.Profile のインスタンスをデシリアライズできません

4

3 に答える 3

2

これは、1 つのインスタンスではなく、Person.class のリストを逆シリアル化しようとしているためです。このような別のクラスを作成します

public class PersonList extends ArrayList<Person> {}

そして使用する

ArrayList<Person> people = mapper.readValue(jsonResponseString, PersonList.class);
于 2013-02-16T18:53:21.557 に答える
2

JSON は配列であるため、リストを逆シリアル化する必要があります。

List<Person> people = mapper.readValue(
                      jsonResponseString, new TypeReference<List<Person >>(){});

ただし、それを行った後、JSON のプロファイル プロパティが原因で、いくつかの追加の逆シリアル化エラーが発生します。チェックアウト: http://jackson.codehaus.org/1.5.7/javadoc/org/codehaus/jackson/annotate/JsonIgnoreProperties.html

アップデート:

public class Person implements Serializable 
{

  public List<Object> profile;

  public String score;
  public String popularity;
  public String name;
  public String id;
  public String biography;
  public String url;
  public String version;
  public String last_modified_at;
}

これに対処するにはいくつかの方法があります。これにより、プロファイルのリンクされたハッシュ マップが得られます。

または、JSON 形式を制御する場合は、プロファイルの構文を次のように変更します。

"profile":[
      image:...,
      image:...
 ]
于 2013-02-16T18:58:47.190 に答える