2017-03-27 7 views
0

私のJSONです:JsonはHashMapを解析します<ArrayList<>> LibgdxでStackOverflowErrorを投げますか?

私は "json.fromJsonは" 正常に動作していると私は "json.toJson(ClassBの)" を呼び出すときに例外がスローされます、 "Libgdx" を使用
{ 
    "objects":{ 
     "apple":[ 
      {"x":3, "y":5}, 
      {"x":6, "y":9} 
     ], 
     "car":[ 
      {"x":7, "y":9}, 
      {"x":5, "y":8} 
     ] 
    } 
} 
import com.badlogic.gdx.utils.Json; 
import java.util.ArrayList; 
import java.util.HashMap; 

public class ClassA{ 
    public Integer x, y; 
} 

public class ClassB{ 
    public HashMap<String, ArrayList<ClassA>> objects; 
} 

public static void main(String[] args) { 
    Json json = new Json(); 

    ClassB classB = json.fromJson(ClassB.class, "{\n" + 
      "   \"objects\":{\n" + 
      "    \"apple\":[\n" + 
      "     {\"x\":3, \"y\":5},\n" + 
      "     {\"x\":6, \"y\":9}\n" + 
      "    ],\n" + 
      "    \"car\":[\n" + 
      "     {\"x\":7, \"y\":9},\n" + 
      "     {\"x\":5, \"y\":8}\n" + 
      "    ]\n" + 
      "   }\n" + 
      "  }"); 

    System.out.println(json.toJson(classB)); 
} 

Exception in thread "main" java.lang.StackOverflowError 
at com.badlogic.gdx.utils.JsonWriter$OutputType.quoteValue(JsonWriter.java:187) 
at com.badlogic.gdx.utils.JsonWriter.value(JsonWriter.java:88) 
at com.badlogic.gdx.utils.Json.writeValue(Json.java:574) 
at com.badlogic.gdx.utils.Json.writeFields(Json.java:290) 
at com.badlogic.gdx.utils.Json.writeValue(Json.java:580) 
at com.badlogic.gdx.utils.Json.writeFields(Json.java:290) 
at com.badlogic.gdx.utils.Json.writeValue(Json.java:580) 
... 

iはC ClassBのでのHashMapから文字列(など)"のArrayList"を変更しますodeはうまく動作します。

なぜ私は "ArrayList"を使用すると、例外がThowingされ、どのようにClassBのインスタンスに私のJSONを解析することができますか?

+0

あなたのコードから判断すると、toJson関数に実際のバグが見つかりました。私はgithubに関する問題を提出します。その間。私はgsonに切り替えることをお勧めします、それは事実上同じです。 –

+0

@ p.streefここに問題のリンクを貼り付けて、ソリューションに従うことができますか?ありがとう – MarsPeople

+0

Libgdx githubの問題https://github.com/libgdx/libgdx/issues/4673 – MarsPeople

答えて

0

コメントに記載されています。

libGDXバグを新しい問題hereとして投稿してください。

(デフォルトの構造を使用する場合はコアプロジェクトに)あなたのbuild.gradleの依存関係にこれを追加します。

compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0' 

はGsonオブジェクトを初期化します。

Gson gson = new Gson(); 

からとにを使用しますJSON機能:

String json = gson.toJson(classB); 

ClassB classB = gson.fromJson(json,ClassB.class); 
1

はい、StackOverflowException自体はバグです。

libGDXのJSONクラスは、型を単独で推論できない場合、クラスの型情報が特定の場所にあることを想定しています。これに関して、Gsonのような他のはるかに大きなライブラリよりもずっと寛容です。

参照:)Json.setElementTypeを(参照、クラス名を短縮することができる

" {\"class\": \"net.your.package.ClassA\", \"x\":3, \"y\":5},\n" 

:あなたの例ではhttps://github.com/libgdx/libgdx/wiki/Reading-%26-writing-JSON#writing-object-graphs

最も簡単な修正があなたのようにClassAのインスタンスを作成することです。

一般的に、プロトタイプ作成のベストプラクティスとして、私はあなたのアプローチの反対をお勧めします。構造体をコードで作成し、JSONに書き込んでlibGDXがデータ構造をどのように認識しているかを確認し、JSONから読み込んで出力を確認します。

サイドノート:ほとんどの場合、libGDXコンテナを使用することをお勧めします(ObjectMap<>およびArray<>)。また、ClassAのメンバーはIntegerの代わりにintとなる可能性があり、自動ボクシングを避けることができます。

関連する問題