Введение в JSON-Java (org.json)

Введение в JSON-Java (org.json)

1. Введение в JSON-Java

JSON (аббревиатура от JavaScript Object Notation) - это облегченный формат обмена данными, он равенmost commonly used for client-server communication.. Его легко читать и писать, и он не зависит от языка. Значение JSON может быть другим JSONobject, array, number, string, boolean (истина / ложь) илиnull.

В этом руководстве мы увидим, как мы можем создавать, обрабатывать и анализировать JSON с помощью одной из доступных библиотек обработки JSON, т.е. библиотекаJSON-Java также известна какorg.json..

Дальнейшее чтение:

Итерация по экземпляру org.json.JSONObject

Узнайте, как перебирать и проходить через JSONObject

Read more

Escape JSON String в Java

Узнайте, как избежать использования ядра JSON String, Java или библиотеки

Read more

2. Предварительно

Прежде чем мы начнем, нам нужно добавить следующую зависимость в нашpom.xml:


    org.json
    json
    20180130

Последнюю версию можно найти вMaven Central repository.

Обратите внимание, что этот пакет уже включен в Android SDK, поэтому мы не должны включать его при его использовании.

3. JSON в Java [пакет org.json]

БиблиотекаJSON-Java, также известная какorg.json (не путать сorg.json.simple от Google), предоставляет нам классы, которые используются для синтаксического анализа и управления JSON в Java.

Кроме того, эта библиотека может также конвертировать между JSON, XML, заголовками HTTP, файлами cookie, списком с разделителями-запятыми или текстом и т. Д.

В этом руководстве мы рассмотрим:

  1. JSONObject - похож на собственный объект типаMap в Java, который хранит неупорядоченные пары ключ-значение.

  2. JSONArray - упорядоченная последовательность значений, аналогичная встроенной в Java реализации Vector

  3. JSONTokener - инструмент, который разбивает фрагмент текста на последовательностьtokens, который может использоватьсяJSONObject илиJSONArray для анализа строк JSON

  4. CDL - инструмент, который предоставляет методы для преобразования текста с разделителями-запятыми вJSONArray и наоборот

  5. Cookie - конвертирует из JSONString в файлы cookie и наоборот

  6. HTTP - используется для преобразования из JSONString в заголовки HTTP и наоборот

  7. JSONException - это стандартное исключение, создаваемое этой библиотекой

4. JSONObjectс

JSONObject - это неупорядоченный набор пар ключ и значение, напоминающий собственные реализации JavaMap.

  • Ключи являются уникальнымиStrings, которые не могут бытьnull

  • Значения могут быть любыми: отBoolean,Number,String,JSONArray или даже от объектаJSONObject.NULL.

  • JSONObject может быть представленString, заключенным в фигурные скобки с ключами и значениями, разделенными двоеточием, и парами, разделенными запятой.

  • В нем есть несколько конструкторов, с помощью которых можно построитьJSONObject

Он также поддерживает следующие основные методы:

  1. get(String key) – gустанавливает объект, связанный с предоставленным ключом, выдаетJSONException, если ключ не найден

  2. opt(String key)- gустанавливает объект, связанный с предоставленным ключом, в противном случаеnull

  3. put(String key, Object value) – вставляет или заменяет пару ключ-значение в текущемJSONObject.

Методput() - это перегруженный метод, который принимает ключ типаString и несколько типов для значения.

Полный список методов, поддерживаемыхJSONObject,visit the official documentation.

Давайте теперь обсудим некоторые из основных операций, поддерживаемых этим классом.

4.1. Создание JSON непосредственно изJSONObject

JSONObject предоставляет API, похожий на интерфейс JavaMap.. Мы можем использовать методput() и указать ключ и значение в качестве аргумента:

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

Теперь нашJSONObject будет выглядеть так:

{"city":"chicago","name":"jon doe","age":"22"}

Существует семь различных перегруженных сигнатур методаJSONObject.put(). Хотя ключ может быть только уникальным, ненулевымString, значение может быть любым.

4.2. Создание JSON из карты

Вместо того, чтобы напрямую помещать ключ и значения вJSONObject, мы можем создать собственныйMap, а затем передать его в качестве аргумента конструкторуJSONObject.

Этот пример даст те же результаты, что и выше:

Map map = new HashMap<>();
map.put("name", "jon doe");
map.put("age", "22");
map.put("city", "chicago");
JSONObject jo = new JSONObject(map);

4.3. СозданиеJSONObject из JSONString

Чтобы разобрать JSONString наJSONObject, мы можем просто передатьString конструктору.

Этот пример даст те же результаты, что и выше:

JSONObject jo = new JSONObject(
  "{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}"
);

Переданный аргументString должен быть действительным JSON, иначе этот конструктор может выдатьJSONException.

4.4. Сериализовать объект Java в JSON

Один из конструкторовJSONObject's принимает POJO в качестве аргумента. В приведенном ниже примере пакет использует геттеры из классаDemoBean и создает для него соответствующийJSONObject.

Чтобы получитьJSONObject из объекта Java, нам нужно использовать класс, который является допустимымJava Bean:

DemoBean demo = new DemoBean();
demo.setId(1);
demo.setName("lorem ipsum");
demo.setActive(true);

JSONObject jo = new JSONObject(demo);

JSONObject jo для этого примера будет:

{"name":"lorem ipsum","active":true,"id":1}

Хотя у нас есть способ сериализации объекта Java в строку JSON, нет способа преобразовать его обратно с помощью этой библиотеки.

Если нам нужна такая гибкость, мы можем переключиться на другие библиотеки, такие какJackson.

5. JSONArrayс

JSONArray - это упорядоченный набор значений, напоминающий собственную реализацию JavaVector.

  • Значения могут быть любыми: отNumber,String,Boolean,JSONArray,JSONObject или даже от объектаJSONObject.NULL.

  • Он представленString в квадратных скобках и состоит из набора значений, разделенных запятыми.

  • Как иJSONObject, у него есть конструктор, который принимает исходныйString и анализирует его для созданияJSONArray

Ниже приведены основные методы классаJSONArray:

  1. get(int index) – rустанавливает значение по указанному индексу (от 0 до общей длины - 1), в противном случае выдаетJSONException

  2. opt(int index) - возвращает значение, связанное с индексом (от 0 до общей длины - 1). Если в этом индексе нет значения, возвращаетсяnull

  3. put(Object value) - добавить значение объекта к этомуJSONArray. Этот метод перегружен и поддерживает широкий диапазон типов данных

Для получения полного списка методов, поддерживаемых JSONArray,visit the official documentation.

5.1. СозданиеJSONArray

После инициализации объекта JSONArray мы можем просто добавлять и извлекать элементы с помощью методовput() иget():

JSONArray ja = new JSONArray();
ja.put(Boolean.TRUE);
ja.put("lorem ipsum");

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

ja.put(jo);

Ниже приводится содержимое нашегоJSONArray (код отформатирован для ясности):

[
    true,
    "lorem ipsum",
    {
        "city": "chicago",
        "name": "jon doe",
        "age": "22"
    }
]

5.2. СозданиеJSONArray непосредственно из строки JSON

Как иJSONObject,JSONArray также имеет конструктор, который создает объект Java непосредственно из JSONString:

JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]");

Этот конструктор может выдатьJSONException, если источникString не является допустимым JSONString.

5.3. СозданиеJSONArray непосредственно из коллекции или массива

КонструкторJSONArray также поддерживает объекты коллекции и массива в качестве аргументов.

Мы просто передаем их в качестве аргумента конструктору, и он вернет объектJSONArray:

List list = new ArrayList<>();
list.add("California");
list.add("Texas");
list.add("Hawaii");
list.add("Alaska");

JSONArray ja = new JSONArray(list);

Теперь нашJSONArray состоит из:

["California","Texas","Hawaii","Alaska"]

6. JSONTokener

JSONTokener принимает источникString в качестве входных данных для своего конструктора и извлекает из него символы и токены. Он используется внутри классов этого пакета (например,JSONObject,JSONArray) для анализа JSONStrings..

Может быть не так много ситуаций, в которых мы будем напрямую использовать этот класс, поскольку ту же функциональность можно достичь с помощью других более простых методов (например,string.toCharArray()):

JSONTokener jt = new JSONTokener("lorem");

while(jt.more()) {
    Log.info(jt.next());
}

Теперь мы можем получить доступ кJSONTokener как к итератору, используя методmore(), чтобы проверить, есть ли какие-либо оставшиеся элементы, иnext() для доступа к следующему элементу.

Токены, полученные из предыдущего примера, будут:

l
o
r
e
m

7. CDLс

Нам предоставлен классCDL (Comma Delimited List) для преобразования текста с разделителями-запятыми вJSONArray и наоборот.

7.1. СозданиеJSONArray непосредственно из текста, разделенного запятыми

Чтобы создатьJSONArray непосредственно из текста, разделенного запятыми, мы можем использовать статический методrowToJSONArray(), который принимаетJSONTokener:

JSONArray ja = CDL.rowToJSONArray(new JSONTokener("England, USA, Canada"));

НашJSONArray теперь состоит из:

["England","USA","Canada"]

7.2. Создание текста с разделителями-запятыми из JSONArray

Чтобы отменить предыдущий шаг и вернуть текст с разделителями-запятыми изJSONArray, мы можем использовать:

JSONArray ja = new JSONArray("[\"England\",\"USA\",\"Canada\"]");
String cdt = CDL.rowToString(ja);

Stringcdt теперь содержит:

England,USA,Canada

7.3. СозданиеJSONArray изJSONObjects с использованием текста, разделенного запятыми

Чтобы создатьJSONArray изJSONObjects, мы будем использовать текстString, содержащий заголовки и данные, разделенные запятыми.

Строки разделяются символом возврата каретки( ) или перевода строки( )..

Первая строка интерпретируется как список заголовков, а все последующие строки обрабатываются как данные:

String string = "name, city, age \n" +
  "john, chicago, 22 \n" +
  "gary, florida, 35 \n" +
  "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(string);

Теперь объектJSONArray result состоит из (вывод отформатирован для ясности):

[
    {
        "name": "john",
        "city": "chicago",
        "age": "22"
    },
    {
        "name": "gary",
        "city": "florida",
        "age": "35"
    },
    {
        "name": "sal",
        "city": "vegas",
        "age": "18"
    }
]

Обратите внимание, что в этом примере и данные, и заголовок были предоставлены в одном и том жеString.There’s an alternative way of doing this where we can achieve the same functionality by supplying a JSONArray that would be used to get the headers and a comma-delimited String working as the data.

Строки разделяются символом возврата каретки( ) или перевода строки( ):

JSONArray ja = new JSONArray();
ja.put("name");
ja.put("city");
ja.put("age");

String string = "john, chicago, 22 \n"
  + "gary, florida, 35 \n"
  + "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(ja, string);

Здесь мы получим содержимое объектаresult точно так же, как и раньше.

КлассCookie работает с файлами cookie веб-браузера и имеет методы для преобразования файла cookie браузера вJSONObject и наоборот.

Вот основные методы классаCookie:

  1. toJsonObject(String sourceCookie) – преобразует строку cookie вJSONObject

  2. toString(JSONObject jo) - противоположен предыдущему методу, преобразуетJSONObject в файл cookieString.

Чтобы преобразовать кукиString вJSONObject, хорошо используйте статический методCookie.toJSONObject():

String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/";
JSONObject cookieJO = Cookie.toJSONObject(cookie);

Теперь мы конвертируемJSONObject в файл cookieString.. Это обратное предыдущему шагу:

String cookie = Cookie.toString(cookieJO);

9. HTTPс

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

Этот класс также имеет два основных метода:

  1. toJsonObject(String sourceHttpHeader) – преобразуетHttpHeader String вJSONObject

  2. toString(JSONObject jo) - преобразует предоставленныйJSONObject вString

9.1. ПреобразованиеJSONObject в заголовок HTTP

МетодHTTP.toString() используется для преобразованияJSONObject в HTTP-заголовокString:

JSONObject jo = new JSONObject();
jo.put("Method", "POST");
jo.put("Request-URI", "http://www.example.com/");
jo.put("HTTP-Version", "HTTP/1.1");
String httpStr = HTTP.toString(jo);

Здесь нашString httpStr будет состоять из:

POST "http://www.example.com/" HTTP/1.1

Обратите внимание, что при преобразовании заголовка HTTP-запросаJSONObject должен содержать ключи“Method”,“Request-URI” и“HTTP-Version”, тогда как для заголовка ответа объект должен содержать“HTTP-Version”, Параметры“Status-Code” и“Reason-Phrase”.

9.2. Преобразование HTTP-заголовкаString обратно вJSONObject

Здесь мы преобразуем HTTP-строку, полученную на предыдущем шаге, обратно в те самыеJSONObject, которые мы создали на этом шаге:

JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1");

10. JSONExceptionс

JSONException - это стандартное исключение, вызываемое этим пакетом при обнаружении какой-либо ошибки.

Это используется во всех классах из этого пакета. За исключением обычно следует сообщение, в котором говорится, что именно пошло не так.

11. Заключение

В этом руководстве мы рассмотрели JSON с использованием Java -org.json - и сосредоточились на некоторых основных функциях, доступных здесь.

Полные фрагменты кода, использованные в этой статье, можно найти наover on GitHub.