假设我们有下一个JSON字符串:
{
"name" : "John",
"age" : "20",
"address" : "some address",
"someobject" : {
"field" : "value"
}
}
查找字段age
及其值(或确定没有给定名称的字段)的最简单(但仍然正确,即正则表达式不可接受)的方法是什么?
P.S。任何开源库都可以。
p.s.2:请不要发布图书馆的链接 - 这不是一个有用的答案。 '给我看代码'(c)。
答案 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库,例如jackson,google-gson,json-io或genson,允许您直接将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"));
}
Gson
和json-simple
的优缺点非常类似于用户定义的Java对象和Map
的优点和缺点。您定义的对象对于所有字段(名称和类型)都是明确的,但不如Map
灵活。
答案 3 :(得分:-2)
我认为使用JSON website中的代码通常是个好主意。如果您进入Maven,这适合您:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20090211</version>
</dependency>