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

Rom*_*man 31 java json gson json-simple

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

{  
   "name" : "John",
   "age" : "20",
   "address" : "some address",
   "someobject" : {
       "field" : "value"    
   }
}
Run Code Online (Sandbox Code Playgroud)

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

ps任何开源库都可以.

ps2:拜托,不要发布图书馆的链接 - 这不是一个有用的答案.'给我看代码'(c).

dev*_*ole 29

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

以下非常基本的示例使用Android 内置的JSON解析器.

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

更高级的JSON库,如jackson,google-gson,json-iogenson,允许您直接将JSON对象转换为Java对象.

  • 实际上我认为这个问题具体是如何找到田地'年龄'. (4认同)
  • 问题是要找到“领域”,而不是年龄。作为子密钥的想法是必需的,而不是直接的。 (2认同)

Pro*_*uce 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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但重要的是要注意这里,我认为,这种不创建单独的绑定类的方法如果你正在寻找嵌套字段(即如果他正在寻找"字段")而不起作用"年龄"他将不得不创建一个新的绑定类 (2认同)

phi*_*kim 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"));
}
Run Code Online (Sandbox Code Playgroud)

优点和缺点的Gson,并json-simple是很像的优点和用户定义的Java对象的缺点和Map.您定义的对象对于所有字段(名称和类型)都是清晰的,但不太灵活Map.