2017-11-04 4 views
0

おそらく、私はJsonからJavaオブジェクトをビルドする際に最も重要な点を見逃しています。私が得たJSONテキストはGson 2.8.2(非直列化)でJsonを解析する - なぜ文字列が数値であると考えられますか?

{ 
    "batchcomplete": "", 
    "query": { 
    "pages": { 
     "736": { 
     "pageid": 736, 
     "ns": 0, 
     "title": "Albert Einstein", 
     "contentmodel": "wikitext", 
     "pagelanguage": "en", 
     "pagelanguagehtmlcode": "en", 
     "pagelanguagedir": "ltr", 
     "touched": "2017-11-01T06:51:29Z", 
     "lastrevid": 807175420, 
     "length": 144138 
     } 
    } 
    } 
} 

であると私は、対応するJavaオブジェクトは、だから私はGson

Gson g = new Gson(); 
WikiResponse r = g.fromJson(content.toString(), WikiResponse.class); 
を使用して上記のJSONテキストをデシリアライズしようとしたクラス

public class WikiResponse { 

    String batchcomplete; 

    HashMap<String, HashMap<String, HashMap<Long, HashMap<String, String>>>> query; 

    public WikiResponse() { 
     batchcomplete = new String(); 
     query = new HashMap<String, HashMap<String, HashMap<Long, HashMap<String, String>>>>(); 
    } 

} 

によって記述されていると

このスタックトレースを取得します。

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "pageid" 
    at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:305) 
    at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:295) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:186) 
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187) 
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187) 
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) 
    at com.google.gson.Gson.fromJson(Gson.java:922) 
    at com.google.gson.Gson.fromJson(Gson.java:887) 
    at com.google.gson.Gson.fromJson(Gson.java:836) 
    at com.google.gson.Gson.fromJson(Gson.java:808) 
    at freedbimporter.rebuild.WikipediaQuery.main(WikipediaQuery.java:85) 
Caused by: java.lang.NumberFormatException: For input string: "pageid" 
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) 
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) 
    at java.lang.Double.parseDouble(Double.java:538) 
    at com.google.gson.stream.JsonReader.nextLong(JsonReader.java:964) 
    at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:303) 
    ... 17 more 

なぜpageidは数字と見なされますか?私はそれをいくつかの文字列キーと宣言されると思った...

助けを非常に感謝します。

敬具

クリスチャン

+0

'pageid'が' Long'と誤って解釈されているので、あなたのマップは1つの重複ネストレベルを持っているようです。 – yegodm

答えて

0

あなたはここで見ることができるよう:JSONでhttps://www.w3schools.com/js/js_json_datatypes.asp

文字列を二重引用符で記述する必要があります。

JSONの数値は、整数または浮動小数点数である必要があります。より慎重に読み、ちょうどトリックをしたPOJOにこだわり、

だから引用符であなたの番号を書いて、あなたの期待文字列

+0

マップの代わりに "実際の" Java POJOを持つのに便利かもしれません。これはあなたを助けることができます:http://www.jsonschema2pojo.org/ – IEE1394

0

感謝を取得します。ありがとう!

関連する問題