1

JSON オブジェクトの文字列表現をマップのリストに解析しようとしています。json オブジェクトは次のような構造になります。

[
 {       
  "first_name": "fname1",
  "last_name": "lname1"
 },
 {
  "first_name": "fname2",
   "last_name": "lname2"
 }
 .
 .
 .
]

既知の唯一のことは、実行時の文字列値 (「first_name」、「last_name」など)のみであるため、事前定義されたクラス (通常は fromJson() メソッドで使用されるような) を作成できません。

次の関数を作成しようとしましたが(オンラインでいくつかの例を見た後)、機能しませんでした:

public List<Map<String, Object>> fromJson(String jsonAsString) {
    final JsonElement jsonElement = this.jsonParser.parse(jsonAsString);

    List<Map<String, Object>> myList= new ArrayList<Map<String, Object>>();
    Type listType = TypeToken.get(myList.getClass()).getType();
    myList= (new Gson()).fromJson(jsonElement, listType);

    return myList;
}   

この関数の結果はリスト (上記の場合は長さ == 2) ですが、2 つのマップの代わりに 2 つのオブジェクトを取得しています。

何か助けはありますか?ありがとう!

4

2 に答える 2

2

の使い方がよくわかりませんTypeToken

ポイントは、次の構文を使用して、キャプチャする型によってパラメーター化された汎用スーパータイプを拡張する匿名クラスを作成することにより、パラメーター化されたTypeToken型 ( など) をキャプチャすることです。List<...>

new TypeToken<... type you want to capture ...>() {}.getType()

あなたの場合、次のように使用する必要があります。

myList = new Gson().fromJson(jsonAsString, 
    new TypeToken<List<Map<String, Object>>>() {}.getType());
于 2012-12-03T15:34:37.670 に答える
0

そのようなジェネリックは使用できません。実行時List<Map<String, Object>> myListは と同じList<Object> myListです。

マップの配列で試すことができます

    Gson gson = new Gson();
    Map[] x = new Map[0];
    Map[] fromJson = gson.fromJson("[\r\n" + 
            " {       \r\n" + 
            "  \"first_name\": \"fname1\",\r\n" + 
            "  \"last_name\": \"lname1\"\r\n" + 
            " },\r\n" + 
            " {\r\n" + 
            "  \"first_name\": \"fname2\",\r\n" + 
            "   \"last_name\": \"lname2\"\r\n" + 
            " }]",x.getClass());
于 2012-12-03T15:38:44.193 に答える