можно ли обрабатывать ответы JSON только с помощью JDK или HttpComponents?

мы обновляем наше веб-приложение, чтобы использовать Graph API Facebook, который возвращает ответы JSON. Однако мы не хотим добавлять зависимости в библиотеку JSON, если у нас нет другого выбора. Для HTTP-запросов на стороне сервера мы используем Apache HttpComponents.

Таким образом, мой вопрос заключается в том, какие классы (если есть) в JDK и/или в HttpComponents, которые я могу использовать для обработки ответов JSON? Фрагменты кода приветствуются :)


person Olivier    schedule 19.10.2010    source источник
comment
В чем именно заключается причина отвращения к дополнительным библиотекам? Основная проблема может быть решена в другом месте.   -  person BalusC    schedule 19.10.2010


Ответы (3)


Возможно. Поскольку JSON является допустимым синтаксисом JavaScript, вы можете использовать встроенный интерпретатор JavaScript через API сценариев для создания графа объектов и обхода его (например, с помощью шаблона посетителя для передачи данных в объект Java).

Однако вам нужно доверять данным, иначе вы оставите себя уязвимыми для атак путем внедрения кода. Для меня это не было бы адекватной заменой надлежащему парсеру JSON.

person McDowell    schedule 19.10.2010

К сожалению, встроенная поддержка JSON была отложена после Java 9.

Но ради спортивности здесь простое хакерское решение Java 8, использующее Nashorn Движок JavaScript без каких-либо внешних зависимостей:

String json = "{\"foo\":1, \"bar\":\"baz\"}";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Object o = engine.eval(String.format("JSON.parse('%s')", json));
Map<String, String> map = (Map<String, String>) o;
System.out.println(Arrays.toString(map.entrySet().toArray()));
// [foo=1, bar=baz]

Начиная с Java 8u60 JSON.parse можно заменить на Java.asJSONCompatible что лучше обработка массивов JSON.

Кредиты:

Эффективный способ передачи JSON между java и javascript< /а>

https://dzone.com/articles/mapping-complex-json-structures-with-jdk8-nashorn

person Vadzim    schedule 27.04.2017
comment
Это здорово! Мой вариант использования: json похож на {\message\ : \{0}\}, и я получаю фактическое сообщение от пользователя. Могу ли я каким-то образом использовать nashorn, чтобы превратить строку в правильный литерал json? - person Jay; 07.05.2019
comment
В чем разница между использованием JSON.parse и Java.asJSONCompatible, как это сделано здесь - adam-bien.com/roller/abien/entry/converting_json_to_map_with - person Jay; 07.05.2019
comment
@Jay, Java.asJSONCompatible отображает массив JSON в список Java. Я обновил ответ. Спасибо за подсказку. - person Vadzim; 08.05.2019
comment
Это разобралось с этим для меня, спасибо. В другом направлении - создание допустимых строк json для отправки, я обнаружил, что это работает - stackoverflow.com/questions/56013134/ - person Jay; 08.05.2019

Я думаю, что вы ищете пакет org.json. Вы можете получить исходный код здесь и просто включите несколько файлов в свой проект, он не имеет никаких зависимостей. Это позволит вам создавать и анализировать JSON. Javadocs хорошо сделаны, и их можно найти здесь.

Например, для использования json вы можете использовать токен и преобразовать необработанную строку в JSONObject. Затем вы можете получить доступ к массивам по индексу или по ключу. Вы можете получить доступ к вложенным массивам, получив их как JSONObject или JSONArray.

JSONTokener tokener = new JSONTokener(myJsonString);
JSONObject json = new JSONObject(tokener);

String error = json.get("error");
int errorCode = json.getInt("error_code");

JSONArray messages = json.getJsonArray("messages");

Обновление: исходный код также доступен на GitHub.

person Christopher Martin    schedule 13.12.2011
comment
Ссылки мертвы, как вы думаете, вы можете их обновить? Спасибо. - person stefanobaghino; 30.12.2017