Подтвердить что ты не робот

Как найти указанное имя и его значение в JSON-строке из Java?

Предположим, что у нас есть следующая строка JSON:

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

Каковы самые простые (но все же правильные, т.е. регулярные выражения неприемлемы) способ найти поле age и его значение (или определить, что там нет поля с заданным именем)?

p.s. любые библиотеки с открытым исходным кодом в порядке.

p.s.2: пожалуйста, не отправляйте ссылки на библиотеки - это не полезный ответ. "Покажите мне код" (c).

4b9b3361

Ответ 2

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

Ответ 3

Я согласен с тем, что 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.

Ответ 4

Я думаю, что использование кода с сайта JSON обычно является хорошей идеей. Если вы находитесь в Maven, это для вас:

<dependency>
   <groupId>org.json</groupId>
   <artifactId>json</artifactId>
   <version>20090211</version>
</dependency>