web-dev-qa-db-ja.com

GSONで動的JSONフィールドを解析する方法は?

そのため、GSONを使用してAPIからJSONを解析していて、データ内の動的フィールドを解析する方法について行き詰まっています。

クエリで返されるJSONデータの例を次に示します。

{

-
30655845: {
    id: "30655845"
    name: "testdata
    description: ""
    latitude: "38"
    longitude: "-122"
    altitude: "0"
    thumbnailURL: http://someimage.com/url.jpg
    distance: 9566.6344386665
}
-
28688744: {
    id: "28688744"
    name: "testdata2"
    description: ""
    latitude: "38"
    longitude: "-122"
    altitude: "0"
    thumbnailURL: http://someimage.com/url.jpg
    distance: 9563.8328713012
}
}

私が現在単一の静的値を処理している方法は、クラスを使用することです。

import com.google.gson.annotations.SerializedName;

public class Result 
{
@SerializedName("id")
public int id;

@SerializedName("name")
public String name;

@SerializedName("description")
public String description;

@SerializedName("latitude")
public Double latitude;

@SerializedName("longitude")
public Double longitude;

@SerializedName("altitude")
public Double altitude;

@SerializedName("thumbnailURL")
public String thumbnailURL;

@SerializedName("distance")
public Double distance;
}

そして、GSONを使用してそれを解析できます。

Gson gson = new Gson();

Reader reader = new InputStreamReader(source);

Result response= gson.fromJson(reader, Result.class);

単一のエントリをクエリして取得し、それを非常に簡単に解析できるため、これがサブデータで機能することはわかっていますが、配列の各値に指定されたランダムな整数値はどうですか? (つまり、30655845および2868874)

何か助けはありますか?

21
Rob Riddle

GSONドキュメント によると、次のようなことができます。

Type mapType = new TypeToken<Map<Integer, Result> >() {}.getType(); // define generic type
Map<Integer, Result> result= gson.fromJson(new InputStreamReader(source), mapType);

または、クラスに カスタムシリアライザー を書いてみることもできます。

免責事項:私もGSonの経験はありませんが、Jacksonのような他のフレームワークの経験はありません。

24
Sasha O