Запросить 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();
На самом деле это не так просто писать и читать. Есть что-то быстрее?
Ответы
Ответ 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.