web-dev-qa-db-ja.com

GSONを使用してandroidの動的な「キー」と「値」でJSONを解析する

私は現在、Androidプロジェクトで作業しており、jsonファイルを返すWebサービスを呼び出す必要があります。GSONライブラリを使用してすべてのjsonファイルを解析し、JSONオブジェクトを取得しています。キーフィールドが動的であるこのjsonデータに遭遇するまで、問題なく機能しています。このファイルの例は次のとおりです。

{ "0": { "count":"5"},
  "1": { "title":"...", "desc":"" },
  "2": { "title":"...", "desc":"" },
  "3": { "title":"...", "desc":"" },
  "4": { "title":"...", "desc":"" },
  "5": { "title":"...", "desc":"" },
  "routes": { "route1":"...", "route3":"" },
}

「0」のキーIDに基づいてカウントを取得できますが、この値を使用して他のキーオブジェクト(キーID 1〜5)を取得する方法がわかりません。必要だった。この問題で誰かが私を助けることができれば本当に感謝します。ありがとう。

35
Philip

私が考えることができる最も簡単なアプローチは、構造をMapMapの)として扱うことです。

Gsonを使用すると、Map構造が静的に既知であり、ルートからのすべてのブランチの深さが同じで、すべてがStringである限り、これは比較的簡単に実行できます。

import Java.io.FileReader;
import Java.lang.reflect.Type;
import Java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class GsonFoo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    Type mapType = new TypeToken<Map<String,Map<String, String>>>() {}.getType();
    Map<String,Map<String, String>> map = gson.fromJson(new FileReader("input.json"), mapType);
    System.out.println(map);

    // Get the count...
    int count = Integer.parseInt(map.get("0").get("count"));

    // Get each numbered entry...
    for (int i = 1; i <= count; i++)
    {
      System.out.println("Entry " + i + ":");
      Map<String, String> numberedEntry = map.get(String.valueOf(i));
      for (String key : numberedEntry.keySet())
        System.out.printf("key=%s, value=%s\n", key, numberedEntry.get(key));
    }

    // Get the routes...
    Map<String, String> routes = map.get("routes");

    // Get each route...
    System.out.println("Routes:");
    for (String key : routes.keySet())
      System.out.printf("key=%s, value=%s\n", key, routes.get(key));
  }
}

より動的なMap構造の処理については、Gsonの代わりに Jackson を使用するように切り替えることを強くお勧めします。Jacksonは任意の複雑さのJSONオブジェクトをJava Map、1行の簡単なコードで、プリミティブ値のタイプを自動的に保持します。

import Java.io.File;
import Java.util.Map;

import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    Map map = mapper.readValue(new File("input.json"), Map.class);
    System.out.println(map);
  }
}

Gsonでも同じことができますが、何十行ものコードが必要です。 (さらに、Gsonには他にもジャクソンへの切り替えを行う価値がある欠点があります。)

41

カウントを使用して、個々のキーオブジェクトを取得できます。したがって、オブジェクト「1」を取得してから、その「title」オブジェクトと「desc」オブジェクトを取得し、次にオブジェクト「2」などを取得します。

0
Torid