49

次の JSON 文字列があるとします。

{  
   "name" : "John",
   "age" : "20",
   "address" : "some address",
   "someobject" : {
       "field" : "value"    
   }
}

ageフィールドとその値を見つける (または指定された名前のフィールドがないことを確認する) 最も簡単な (ただし正しい、つまり正規表現は使用できません) 方法は何ですか?

ps オープンソースのライブラリは問題ありません。

ps2: ライブラリへのリンクを投稿しないでください。これは有用な回答ではありません。「コードを見せて」(c)。

4

3 に答える 3

54

JSON ライブラリを使用して文字列を解析し、値を取得します。

次の非常に基本的な例では、 Androidの組み込みJSON パーサーを使用しています。

String jsonString = "{ \"name\" : \"John\", \"age\" : \"20\", \"address\" : \"some address\" }";
JSONObject jsonObject = new JSONObject(jsonString);
int age = jsonObject.getInt("age");

jacksongoogle-gsonjson-iogensonなどのより高度な JSON ライブラリを使用すると、JSON オブジェクトを Java オブジェクトに直接変換できます。

于 2011-05-27T14:00:30.543 に答える
10

Gson は、考えられる最も単純なソリューションの 1 つを可能にします。Jackson や svenson などの同様の API と比較して、Gson はデフォルトで、未使用の JSON 要素を必要とせずに、Java 構造でバインディングを使用できるようにします。尋ねられた質問に固有の、ここに実用的な解決策があります。

import com.google.gson.Gson;

public class Foo
{
  static String jsonInput = 
    "{" + 
      "\"name\":\"John\"," + 
      "\"age\":\"20\"," + 
      "\"address\":\"some address\"," + 
      "\"someobject\":" +
      "{" + 
        "\"field\":\"value\"" + 
      "}" + 
    "}";

  String age;

  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    Foo thing = gson.fromJson(jsonInput, Foo.class);
    if (thing.age != null)
    {
      System.out.println("age is " + thing.age);
    }
    else
    {
      System.out.println("age element not present or value is null");
    }
  }
}
于 2011-06-17T03:51:57.253 に答える
9

GsonGoogleが明確で使いやすいことに同意します。ただし、JSON 文字列からインスタンスを取得するための結果クラスを作成する必要があります。結果クラスを明確にできない場合は、次を使用しますjson-simple

// import static org.hamcrest.CoreMatchers.is;
// import static org.junit.Assert.assertThat;
// import org.json.simple.JSONObject;
// import org.json.simple.JSONValue;
// import org.junit.Test;

@Test
public void json2Object() {
    // given
    String jsonString = "{\"name\" : \"John\",\"age\" : \"20\","
            + "\"address\" : \"some address\","
            + "\"someobject\" : {\"field\" : \"value\"}}";

    // when
    JSONObject object = (JSONObject) JSONValue.parse(jsonString);

    // then
    @SuppressWarnings("unchecked")
    Set<String> keySet = object.keySet();
    for (String key : keySet) {
        Object value = object.get(key);
        System.out.printf("%s=%s (%s)\n", key, value, value.getClass()
                .getSimpleName());
    }

    assertThat(object.get("age").toString(), is("20"));
}

と の長所と短所はGsonjson-simpleユーザー定義の Java オブジェクト と の長所と短所によく似ていますMap。定義するオブジェクトは、すべてのフィールド (名前とタイプ) に対して明確ですが、 より柔軟性が低くなりMapます。

于 2012-03-16T14:42:11.727 に答える