如何从Java中查找JSON字符串中指定名称及其值?

57

假设我们有以下JSON字符串:

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

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


2
展示你所尝试的代码,链接到库是完全可以的,你可以从中自学。如果你的问题是“如何使用XXX库解析JSON?”,那么你请求代码的要求是有效的,否则,不要害怕尝试新东西。 - Jesse Webb
这个问题解决了吗? - Programmer Bruce
尝试使用以下代码:import com.google.gson.JsonObject; import com.google.gson.JsonParser; JsonParser parser = new JsonParser(); JsonObject obj = parser.parse(jsonString).getAsJsonObject(); String age = obj.get("age").getAsString(); - Suliman Alzamel
问题被(不合理地)关闭了,所以我只能在评论中回答:将implementation('org.json:json:20230227')添加到您的build.gradle中,然后使用int age = new JSONObject(yourJsonString).getInt("age")来获取年龄。 - Marco Lackovic
3个回答

63
使用一个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对象。

2
问题是要找到“字段”,而不是年龄。这意味着需要一个子键,而不是立即的一个。 - Abby
5
实际上,我认为问题的重点是如何找到名为“age”的字段。 - devconsole
链接失效了... - Robin Dijkhof
@RobinDijkhof 我已经更新了我的回答。 - devconsole
'getInt()' 方法在哪里? - YourHelper

10

我同意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"));
}
< p >使用Gsonjson-simple的优缺点,就像使用用户定义的Java对象和Map一样。您定义的对象对所有字段(名称和类型)都很清晰,但比Map不够灵活。


如果所需字段是字符串并且存在于最外层的JSON对象中,那么我们是否可以直接使用jsonObject.get("myStringField").toString(); 而不是迭代keySet?顺便说一下,感谢提到导入,因为很多项目都有JSONObject。 - MasterJoe

10

Gson提供了一种最简单的解决方案。与类似的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");
    }
  }
}

3
回答不错,但需要注意的一点是,如果您正在寻找嵌套字段(即如果他正在寻找“field”而不是“age”,他将不得不创建一个新的绑定类),那么不为绑定创建单独的类的方法将不起作用。 - stojke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接