如何在Java中用JSON-string查找指定的名称及其值?

时间:2011-05-27 13:52:04

标签: java json gson json-simple

假设我们有下一个JSON字符串:

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

查找字段age及其值(或确定没有给定名称的字段)的最简单(但仍然正确,即正则表达式不可接受)的方法是什么?

P.S。任何开源库都可以。

p.s.2:请不要发布图书馆的链接 - 这不是一个有用的答案。 '给我看代码'(c)。

4 个答案:

答案 0 :(得分:24)

使用JSON库解析字符串并检索值。

以下非常基本的示例使用Android内置的JSON parser

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

更高级的JSON库,例如jacksongoogle-gsonjson-iogenson,允许您直接将JSON对象转换为Java对象。

答案 1 :(得分:9)

Gson允许最简单的解决方案之一。与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");
    }
  }
}

答案 2 :(得分:6)

我同意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对象和Map的优点和缺点。您定义的对象对于所有字段(名称和类型)都是明确的,但不如Map灵活。

答案 3 :(得分:-2)

我认为使用JSON website中的代码通常是个好主意。如果您进入Maven,这适合您:

<dependency>
   <groupId>org.json</groupId>
   <artifactId>json</artifactId>
   <version>20090211</version>
</dependency>