1

応答を json として返し、Gson を使用してそれらを Java オブジェクトに変換するサービスを呼び出しています。50 件中 47 件で Java オブジェクトを取得しますが、3 件で次のエラーが発生します。

com.google.gson.JsonSyntaxException: Expecting number, got: STRING
    at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:304)
    at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:293)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
    at com.google.gson.Gson.fromJson(Gson.java:795)
    at com.google.gson.Gson.fromJson(Gson.java:761)
    at com.google.gson.Gson.fromJson(Gson.java:710)
    at com.google.gson.Gson.fromJson(Gson.java:682)

失敗している 1 つの json 応答は、http: //ec2-50-112-212-186.us-west-2.compute.amazonaws.com/ske.jsonで確認できます。私のJava Beanは次のとおりです。

import java.util.List;

import com.google.gson.annotations.SerializedName;

public class WordSketch{

    @SerializedName("Gramrels")
    private List<Gramrel> gramrels;

    public List<Gramrel> getGramrels(){
        return this.gramrels;
    }
    public void setGramrels(List<Gramrel> gramrels){
        this.gramrels = gramrels;
    }

    public static class Gramrel {

        @SerializedName("Words")
        private List<Word> words;
        private Number count;
        private String name;
        private Number score;
        private Number seek;

        public List<Word> getWords(){
            return this.words;
        }
        public void setWords(List<Word> words){
            this.words = words;
        }
        public Number getCount(){
            return this.count;
        }
        public void setCount(Number count){
            this.count = count;
        }
        public String getName(){
            return this.name;
        }
        public void setName(String name){
            this.name = name;
        }
        public Number getScore(){
            return this.score;
        }
        public void setScore(Number score){
            this.score = score;
        }
        public Number getSeek(){
            return this.seek;
        }
        public void setSeek(Number seek){
            this.seek = seek;
        }
    }

    public static class Word {
        private Number count;
        private Number id;
        private String lempos;
        private Number score;
        private Number seek;
        private String word;

        public Number getCount(){
            return this.count;
        }
        public void setCount(Number count){
            this.count = count;
        }
        public Number getId(){
            return this.id;
        }
        public void setId(Number id){
            this.id = id;
        }
        public String getLempos(){
            return this.lempos;
        }
        public void setLempos(String lempos){
            this.lempos = lempos;
        }
        public Number getScore(){
            return this.score;
        }
        public void setScore(Number score){
            this.score = score;
        }
        public Number getSeek(){
            return this.seek;
        }
        public void setSeek(Number seek){
            this.seek = seek;
        }
        public String getWord(){
            return this.word;
        }
        public void setWord(String word){
            this.word = word;
        }
    }
}

実際の gson 呼び出しはgson.fromJson(json, WordSketch.class).

jsonのどの部分でgsonが失敗しているのかわからないので、誰かが間違っていることを指摘したり、少なくとも(迅速に)デバッグする方法を教えてくれませんか?

どうもありがとう、

4

1 に答える 1

4

JSON を観察することで、通常は数値を持つフィールドと、値として空の文字列を持つフィールドがあることに気付きました。

たとえば、応答の 3 番目のグラムレルは次のとおりです。

{
    "count": "",
    "colbreak": 1,
    "name": "unary rels",
    "score": "",
    "Words": [
        {
            "count": 6,
            "word": "prp_għaċ-",
            "name": "prp_għaċ-",
            "score": 9.1,
            "Words": [ ],
            "seek": 2231297
        }
    ],
    "seek": 0
},

あなたが定義countscoreたタイプのクラスのようにNumber、GSONは文句を言います!


編集:クラスのすべてのフィールドを型にすることをお勧めします。Stringその後、必要に応じて変換できます...つまり、作成したクラスを応答ラップクラスとして使用してから、実際のクラスを作成できますその応答クラスのクラス...

WordSketch ws = gson.fromJson(json, WordSketch.class);
for (Gramrel g in ws.getGramrels) {
    Number count = //convert the String into Number...
    //etc...
    MyGrammel myGrammel = new MyGrammel(count, ...);
}

この例では、クラスは応答をラップGramrelするための一時的なクラスにすぎず、実際に使用するクラスです ( type のプロパティを持つクラス)...MyGramrelNumber

于 2013-04-18T20:38:56.877 に答える