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

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

于 2011-05-27T14:00:30.543 回答
10

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");
    }
  }
}
于 2011-06-17T03:51:57.253 回答
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"));
}

Gson和的优缺点json-simple非常类似于用户定义的 Java 对象和Map. 您定义的对象对于所有字段(名称和类型)都是明确的,但不如Map.

于 2012-03-16T14:42:11.727 回答