web-dev-qa-db-ja.com

JavaからJSON文字列で指定された名前とその値を見つける方法は?

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

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

フィールドageとその値を見つける(または、与えられた名前のフィールドがないと判断する)最も簡単な(しかし、まだ正しい、つまり正規表現は受け入れられない)方法は何ですか?

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

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

29
Roman

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

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

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

jacksongoogle-gsonjson-io または genson などのより高度なJSONライブラリJSONオブジェクトをJavaオブジェクトに直接変換します。

28
devconsole

Gsonは、最も単純なソリューションの1つを可能にします。 Jacksonやsvensonのような類似のAPIと比較して、GsonはデフォルトでJava構造で利用可能なバインディングを持つために未使用のJSON要素さえ必要としません。質問に対する具体的な解決策は次のとおりです。

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");
    }
  }
}
9

GoogleのGsonは明確で使いやすいことに同意します。ただし、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 ObjectとMap。の長所と短所によく似ています。すべてのフィールド(名前とタイプ)で明確ですが、Mapよりも柔軟性が劣ります。

6
philipjkim