Ответ 1
Используйте библиотеку JSON для синтаксического анализа строки и получения значения.
Следующий очень простой пример использует встроенный
Предположим, что у нас есть следующая строка JSON:
{
"name" : "John",
"age" : "20",
"address" : "some address",
"someobject" : {
"field" : "value"
}
}
Каковы самые простые (но все же правильные, т.е. регулярные выражения неприемлемы) способ найти поле age
и его значение (или определить, что там нет поля с заданным именем)?
p.s. любые библиотеки с открытым исходным кодом в порядке.
p.s.2: пожалуйста, не отправляйте ссылки на библиотеки - это не полезный ответ. "Покажите мне код" (c).
Используйте библиотеку JSON для синтаксического анализа строки и получения значения.
Следующий очень простой пример использует встроенный
Gson допускает одно из самых простых возможных решений. По сравнению с аналогичными API, такими как Jackson или svenson, 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");
}
}
}
Я согласен с тем, что 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
.
Я думаю, что использование кода с сайта JSON обычно является хорошей идеей. Если вы находитесь в Maven, это для вас:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20090211</version>
</dependency>