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

Запросить JSONObject в java

Мне было интересно, есть ли где-то ява библиотека, способная запросить JSONObject. Более подробно я ищу что-то вроде:

String json = "{ data: { data2 : { value : 'hello'}}}";

...
// Somehow we managed to convert json to jsonObject
...

String result = jsonObject.getAsString("data.data2.value");

System.out.println(result);

Я ожидаю получить "привет" в качестве вывода.

В настоящее время самый быстрый способ, который я нашел, - использовать Gson:

jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString();

На самом деле это не так просто писать и читать. Есть что-то быстрее?

4b9b3361

Ответ 1

Прежде всего, я бы рекомендовал рассмотреть привязку объектов JSON.

Но если вы получаете произвольные объекты JSON, и вы хотели бы обработать их так, как вы описали, я бы предложил объединить Jackson JSON processor наряду с Apache Commons Beanutils.

Идея следующая: Джексон по умолчанию обрабатывает все JSON как экземпляры java.util.Map, между тем Commons Beanutils упрощает доступ к свойствам для объектов, включая массивы и поддержку карт.

Итак, вы можете использовать его примерно так:

//actually it is a Map instance with maps-fields within
Object jsonObj = objectMapper.readValue(json, Object.class);

Object hello = PropertyUtils.getProperty(jsonObj, "data.data2.value")

System.out.println(hello); //prints hello

Ответ 2

Я только неожиданно нашел очень интересный проект: JSON Path

JsonPath - это JSON, что XPATH для XML, простой способ извлечения частей данного документа.

С помощью этой библиотеки вы можете делать то, что вы запрашиваете еще проще, тогда мое предыдущее предложение:

String hello = JsonPath.read(json, "$.data.data2.value");

System.out.println(hello); //prints hello

Надеюсь, это тоже поможет.

Ответ 3

Хотя не совсем то же самое, у Jackson есть представление Tree Model, подобное Gson:

JsonNode root = objectMapper.readTree(jsonInput);
return root.get("data").get("data2").get("value").asText();

поэтому вам нужно пройти его шаг за шагом.

EDIT (август 2015 г.)

Фактически сейчас (с Jackson 2.3) поддерживается выражение JSON Pointer с Джексоном. Таким образом, вы можете использовать:

return root.at("/data/data2/value").asText();

Ответ 4

Я не думаю.

Рассмотрим класс java

class Student {
    Subject subject = new Subject();
}

class Subject {
    String name;
}

Здесь, если мы хотим получить доступ к имени субъекта, тогда

Student stud = new Student();
stud.subject.name; 

Мы не можем получить имя доступа напрямую, если тогда мы не получим правильное имя темы. Как здесь:

jsonObject.getAsJsonObject("data")
          .getAsJsonObject()
          .get("data2")
          .getAsJsonObject("value")
          .getAsString();

Если вы хотите использовать тот же объект, что и java, используйте

ClassName classObject = new Gson().fromJson(JsonString, ClassName.class);

КлассName должен иметь все поля для соответствия jsonstring. Если у вас есть jsonobject внутри jsonobject, вам нужно создать отдельный класс, как я делаю в классе Student и Subject.