it-roy-ru.com

Какой использовать? JSONObject от org.json VS JsonObject от javax.json

Это мой первый пост. Как начинающий разработчик Android, я почти ежедневно читал SO сообщения на разные темы, но по этому вопросу я не нашел никакой помощи от Google или SO.

Мои исследования до сих пор:
Поиск этого вопроса был сложнее, чем обычно, потому что поисковые системы, похоже, не заботятся о чувствительности к регистру, что жизненно важно в этом вопросе. Поиск в Google дал мне только ссылки на сами классы, старые статьи или совершенно не относящиеся к делу статьи. Самым близким был JSONArray против JSONObject, и это совершенно другой вопрос. SO поиск дал те же результаты. Насколько я могу судить, ВСЕ соответствующие сообщения в SO относятся к JSONObject, а не к JsonObject.

Ни в Oracle, ни в документации на json.org не упоминается другая сторона, ни на странице разработчика JSONObject для Android, которая использует библиотеку org.json.

http://docs.Oracle.com/javaee/7/api/javax/json/JsonObject.html
http://www.json.org/javadoc/org/json/JSONObject.html
Я также разместил бы ссылку на справочную страницу Android для JSONObject, но мой представитель как новичок слишком низкий.

История проблем (ы): Я читал о кодировке и декодировании Json со страницы Oracle, и я попытался скопировать и вставить в мою IDE AndriodStudio, которая сразу же вызвала ошибку, для которой он не предлагал оператор импорта, такой как это обычно делает. Я пришел, чтобы узнать, что означает, что класс не является частью встроенных библиотек.

Проблема заключалась в том, что код, который я вставил, использовал JsonObject (который поставляется из библиотеки javax.json), а не JSONObject (который приходит из библиотеки org.json). Когда я заметил разницу в случае между страницей Android и страницей Oracle, я изменил свой код с Json на JSON и сразу же мой IDE предложил оператор импорта org.json.

Вопрос (ы): Почему класс, созданный Oracle, не является частью библиотек по умолчанию, если используется внешняя библиотека?
Является ли JSON старым, устаревшим способом, а Json новым, правильным?
Они функционально идентичны? Если нет, приведите примеры?
Некоторые ситуации лучше для одного, а некоторые лучше для другого?
В конечном счете, что я должен использовать и почему (если это еще не сделано)?
Если, javax.json, где лучшее (самое безопасное) место для загрузки этой библиотеки)?

26
Phyxius81

Немного поздно, но я хотел поделиться своим мнением по этому поводу.

Я столкнулся с этой проблемой недавно, когда нашел проект Java с обеими библиотеками, и они использовались одновременно.

Я думаю, что org.json легче читать и использовать по двум основным причинам (для моих нужд):

  1. JsonObject является неизменным. Вы не можете добавить новые пары ключ/значение к уже существующему JsonObject (ссылка здесь: javax.json: добавить новый JsonNumber к существующему JsonObject )

  2. Для печати JsonObject или JsonArray достаточно нескольких строк, а для JSONObject или JSONArray требуется всего одна строка. Пример:

    StringWriter sw = new StringWriter();
    Map<String, Object> properties = new HashMap<>();
    properties.put(JsonGenerator.PRETTY_PRINTING, true);
    
    JsonWriterFactory writerFactory = Json.createWriterFactory(properties);
    JsonWriter jsonWriter = writerFactory.createWriter(sw);
    
    jsonWriter.writeObject(jsonObject); //JsonObject created before
    jsonWriter.close();
    String prettyPrintedJSON = sw.toString();
    

Это код, который я использую, чтобы получить JSON с отступом для записи в файл. А с org.json мне нужна только jsonObject.toString(4)

Другое отличие - конструкторы. Вам понадобится JsonObjectBuilder для создания JSON с javax.json. Еще один шаг, которого можно избежать.

Я уверен, что есть больше различий (не уверен, возможно ли создать JsonObject из строки), но это мои мысли.

14
Samuel Méndez

JSONObject, как уже упоминалось, предоставляется Android API. JsonObject специально используется для разработки Java EE, в частности, для веб-приложений и сетевых возможностей. 

Причина, по которой Android не упаковывает JsonObject из пакета Oracle Java EE, заключается в том, что многое из того, что может сделать javax, не разрешено в Android, например, доступ к Интернету без разрешения. Это означает, что импорт целых jar-файлов javax может конфликтовать с Android.

Если вы планируете создать свой собственный бэкэнд с Java EE, я настоятельно рекомендую использовать JsonObject поверх JSONObject. С другой стороны, если вы знаете готовый сервис отдыха или что-то подобное, что еще лучше поддерживает JSON для Android. 

2
Full Stack

Я рекомендую вам использовать Google json-simple toolkit для работы с объектами JSON. Он предоставляет полезные функции и не зависит от внешних библиотек, что оказалось огромной проблемой при разработке приложений для Android.

Чтобы ответить на ваш вопрос: если вы не хотите использовать json-simple в своем проекте, вам следует использовать JSONObject из org.json, потому что он предоставляется Android JDK. Для получения дополнительной информации см. http://developer.Android.com/reference/org/json/JSONObject.html .

0
michip96