възможно ли е да се обработват 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 List. Актуализирах отговора. Благодаря за подсказката. - 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