2017-02-03 4 views
0

JSONファイルを使用してゲームのキャッシュを作成しようとしています。このデータの作成と検索は、GSONを使用して行います。私は、これらのオブジェクト内に他のオブジェクトも格納されている複数のオブジェクトを含むJSONファイルを持っています。Gsonを使用してJSONファイルから入れ子になったオブジェクトを取得する

私の質問は、このデータを最も適切な方法で取得する方法です。

オブジェクト1:

public class GameItem { 

    private final int id; 
    private final String name; 
    private final String description; 
    private final int shopValue; 
    private final ItemStats stats; 

    public GameItem(int id, String name, String description, int shopValue, ItemStats stats) { 
     this.id = id; 
     this.name = name; 
     this.description = description; 
     this.shopValue = shopValue; 
     this.stats = stats; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public int getShopValue() { 
     return shopValue; 
    } 

    public ItemStats getStats() { 
     return stats; 
    } 

} 

オブジェクト2:

public class ItemStats { 

    private final int stabAttack; 
    private final int slashAttack; 
    private final int crushAttack; 
    private final int magicAttack; 
    private final int rangeAttack; 
    private final int stabDefence; 
    private final int slashDefence; 
    private final int crushDefence; 
    private final int magicDefence; 
    private final int rangeDefence; 
    private final int strengthBonus; 
    private final int prayerBonus; 

    public ItemStats(int stabAttack, int slashAttack, int crushAttack, int magicAttack, int rangeAttack, int stabDefence, int slashDefence, int crushDefence, int magicDefence, int rangeDefence, int strengthBonus, int prayerBonus) { 
     this.stabAttack = stabAttack; 
     this.slashAttack = slashAttack; 
     this.crushAttack = crushAttack; 
     this.magicAttack = magicAttack; 
     this.rangeAttack = rangeAttack; 
     this.stabDefence = stabDefence; 
     this.slashDefence = slashDefence; 
     this.crushDefence = crushDefence; 
     this.magicDefence = magicDefence; 
     this.rangeDefence = rangeDefence; 
     this.strengthBonus = strengthBonus; 
     this.prayerBonus = prayerBonus; 
    } 

    public int getStabAttack() { 
     return stabAttack; 
    } 

    public int getSlashAttack() { 
     return slashAttack; 
    } 

    public int getCrushAttack() { 
     return crushAttack; 
    } 

    public int getMagicAttack() { 
     return magicAttack; 
    } 

    public int getRangeAttack() { 
     return rangeAttack; 
    } 

    public int getStabDefence() { 
     return stabDefence; 
    } 

    public int getSlashDefence() { 
     return slashDefence; 
    } 

    public int getCrushDefence() { 
     return crushDefence; 
    } 

    public int getMagicDefence() { 
     return magicDefence; 
    } 

    public int getRangeDefence() { 
     return rangeDefence; 
    } 

    public int getStrengthBonus() { 
     return strengthBonus; 
    } 

    public int getPrayerBonus() { 
     return prayerBonus; 
    } 
} 

JSONデータ:

[ 
    { 
     "id": 0, 
     "name": "Dwarf_remains", 
     "description": "The_body_of_a_Dwarf_savaged_by_Goblins.", 
     "shopValue": 1, 
     "stats": [ 
      "stabAttack": 0, 
      "slashAttack": 0, 
      "crushAttack": 0, 
      "magicAttack": 0, 
      "rangeAttack": 0, 
      "stabDefence": 0, 
      "slashDefence": 0, 
      "crushDefence": 0, 
      "magicDefence": 0, 
      "rangeDefence": 0, 
      "strengthBonus": 0, 
      "prayerBonus": 0 
     ] 
    }, 
    { 
     "id": 1, 
     "name": "Toolkit", 
     "description": "Good_for_repairing_a_broken_cannon.", 
     "shopValue": 1, 
     "stats": [ 
      "stabAttack": 0, 
      "slashAttack": 0, 
      "crushAttack": 0, 
      "magicAttack": 0, 
      "rangeAttack": 0, 
      "stabDefence": 0, 
      "slashDefence": 0, 
      "crushDefence": 0, 
      "magicDefence": 0, 
      "rangeDefence": 0, 
      "strengthBonus": 0, 
      "prayerBonus": 0 
     ] 
    }, 
    { 
     "id": 2, 
     "name": "Cannonball", 
     "description": "Ammo_for_the_Dwarf_Cannon.", 
     "shopValue": 3000, 
     "stats": [ 
      "stabAttack": 0, 
      "slashAttack": 0, 
      "crushAttack": 0, 
      "magicAttack": 0, 
      "rangeAttack": 0, 
      "stabDefence": 0, 
      "slashDefence": 0, 
      "crushDefence": 0, 
      "magicDefence": 0, 
      "rangeDefence": 0, 
      "strengthBonus": 0, 
      "prayerBonus": 0 
     ] 
    } 
] 
+0

あなたは罰金をやっている、それは「統計」で行く配列であるため、単に民間最終リスト統計など民間最終ItemStatsの統計を行います。[...]しかし、あなたが不足しています[{} ... 。] jsonの配列の中で、おそらく多分。 –

+0

あなたは何を意味するかわからない、私に例を挙げてくれますか? – Fryslan

答えて

0

それはあなたの本当に依存するかもしれないので、何も "最善" の方法があってはいけません場合。しかし、効率的に、このオブジェクトをデシリアライズし、バックシリアル化するために、あなたがする必要があります。

  • まず第一に、それは構文的には違法なので

あなたのJSONファイルを修正:statsプロパティは、囲まれたオブジェクトとして宣言する必要があります

"stats": { 
    "stabAttack": 0, 
    "slashAttack": 0, 
    "crushAttack": 0, 
    "magicAttack": 0, 
    "rangeAttack": 0, 
    "stabDefence": 0, 
    "slashDefence": 0, 
    "crushDefence": 0, 
    "magicDefence": 0, 
    "rangeDefence": 0, 
    "strengthBonus": 0, 
    "prayerBonus": 0 
} 
    {}(ない [有するアレイと ]など)と
  • を使用して、配列の要素の実数型Gson教えるこれは、ターゲット・タイプを(様々なライブラリは同様の技術を使用する)を指定するための特別なGson機構であるTypeToken

適切。ソースのタイプとしてList.classを指定すると動作しません。基本的には、Javaジェネリックの動作(型パラメータ化はクラス、フィールド、またはメソッドにのみ記述できますが、型情報自体が十分でない限りインスタンスに直接書き込むことができないため)List<Map<String, Object>>になります。そのような情報がどこから得ることができるかを認識しているカスタムデシリアライザを使用してください)。

private static final TypeToken<List<GameItem>> listOfGamesTypeToken = new TypeToken<List<GameItem>>() { 
}; 

型トークンは、スレッドセーフである(ならびにGsonインスタンスである)、容易にグローバルに共有(しかし賢明)することができることに留意されたいです。

  • はバッファの読み取りからおよびへの書き込みを適用するI/OはReaderまたはJsonReaderから(完全にストリームと仕事の両方を)読んでいるGsonのインスタンスを使用してデシリアライズする

最善の方法をスト​​リーミングします。同じことがWriterJsonWriterになります。

private static List<GameItem> readGameItemsFromFile(final File file) 
     throws IOException { 
    try (final InputStream inputStream = new FileInputStream(file); 
      final Reader reader = new BufferedReader(new InputStreamReader(inputStream))) { 
     // Note that this .fromJson overload: 
     // - does not require an intermediate string to be collected and then parsed (a common misuse of Gson parsing facilities) 
     // - specifies the target list element type because List.class is just a class, 
     return gson.fromJson(reader, listOfGamesTypeToken.getType()); 
    } 
} 

private static void writeGameItemsToFile(final List<GameItem> gameItems, final File file) 
     throws IOException { 
    try (final OutputStream outputStream = new FileOutputStream(file); 
      final Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream))) { 
     // Note that this .toJson overload: 
     // - allows to "calibrate" the source list type more precisely 
     // - does not require an intermediate JSON string collected into memory and then flushed to a file (another common misuse) 
     gson.toJson(gameItems, listOfGamesTypeToken.getType(), writer); 
    } 
} 

public static void main(final String... args) 
     throws IOException { 
    final File file = new File("gameItems.json"); 
    final List<GameItem> gameItems = readGameItemsFromFile(file); 
    // ... process the game items here ... 
    writeGameItemsToFile(gameItems, file); 
} 
+0

助けてくれてありがとうが、このエラーが発生しました。 'スレッド内の例外"メイン "com.google.gson。JsonSyntaxException:java.lang.IllegalStateException:BEGIN_ARRAYが必要ですが、行1の列2のパス$ \t com.google.gson.Gson.fromJson(Gson.java:891) \t com.google.gson.GsonでBEGIN_OBJECTが発生しました。 fromJson(Gson.java:844) \t at org.fryslan.server.json.DataReader.readGameItemsFromFile(DataReader.java:31) ' – Fryslan

+0

@Fryslan単一のオブジェクトまたはリストを逆直列化しようとしていますか?上のコードでは、あなたが質問で提供したJSONに従って、[{...}、{...}、{...}、...] '(オブジェクトの配列)のようなJSONを解析し、後で。あなたが解析しようとしているJSONファイルと一致していますか? –

+0

おかげさまで..... 今すぐお仕事してください。 – Fryslan

関連する問題