Потоковый API читает и записывает содержимое JSON как отдельные события. JsonParser читает данные, тогда как JsonGenerator записывает данные. Это самый мощный подход из трех, с минимальными накладными расходами и самый быстрый в операциях чтения / записи. Это аналог синтаксического анализатора Stax для XML.
В этой статье мы продемонстрируем использование потоковых API Джексона для чтения и записи данных JSON. Потоковый API работает с концепцией токена, и с каждой деталью Json нужно обращаться осторожно. Ниже приведены два класса, которые мы будем использовать в примерах:
-
JsonGenerator — запись в строку JSON.
-
JsonParser — Parse JSON String.
JsonGenerator — запись в строку JSON.
JsonParser — Parse JSON String.
Написание JSON с использованием JsonGenerator
Использовать JsonGenerator довольно просто. Сначала создайте JsonGenerator с помощью метода JsonFactory.createJsonGenerator () и используйте его методы write *** () для записи каждого значения json.
JsonFactory jsonFactory = new JsonFactory(); JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File( "student.json"), JsonEncoding.UTF8); // { jsonGenerator.writeStartObject(); // "name" : "Mahesh Kumar" jsonGenerator.writeStringField("name", "Mahesh Kumar");
Давайте посмотрим JsonGenerator в действии. Создайте файл Java-класса с именем JacksonTester в C: \> Jackson_WORKSPACE .
Файл: JacksonTester.java
импорт java.io.File; импорт java.io.IOException; импорт java.util.Map; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; открытый класс JacksonTester { public static void main (String args []) { пытаться { JsonFactory jsonFactory = new JsonFactory (); JsonGenerator jsonGenerator = jsonFactory.createGenerator (новый файл ("student.json"), JsonEncoding.UTF8); jsonGenerator.writeStartObject (); // "имя": "Махеш Кумар" jsonGenerator.writeStringField ("имя", "Махеш Кумар"); // "возраст": 21 jsonGenerator.writeNumberField ("age", 21); // "проверено": ложь jsonGenerator.writeBooleanField («подтверждено», false); // "отметки": [100, 90, 85] jsonGenerator.writeFieldName ( "метки"); // [ jsonGenerator.writeStartArray (); // 100, 90, 85 jsonGenerator.writeNumber (100); jsonGenerator.writeNumber (90); jsonGenerator.writeNumber (85); //] jsonGenerator.writeEndArray (); jsonGenerator.writeEndObject (); jsonGenerator.close (); // результат student.json // { // "имя": "Махеш Кумар", // "возраст": 21, // «проверено»: ложь, // "отметки": [100,90,85] //} ObjectMapper mapper = new ObjectMapper (); Map <String, Object> dataMap = mapper.readValue (новый файл ("student.json"), Map.class); System.out.println (dataMap.get ( "имя")); System.out.println (dataMap.get ( "возраст")); System.out.println (dataMap.get ( "проверено")); System.out.println (dataMap.get ( "метки")); } catch (JsonParseException e) {e.printStackTrace (); } catch (JsonMappingException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); } } }
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Jackson_WORKSPACE>javac JacksonTester.java
Теперь запустите jacksonTester, чтобы увидеть результат:
C:\Jackson_WORKSPACE>java JacksonTester
Проверьте вывод
Mahesh Kumar 21 false [100, 90, 85]
Чтение JSON с использованием JsonParser
Использование JsonParser снова довольно просто. Сначала создайте JsonParser с помощью метода JsonFactory.createJsonParser () и используйте его методы nextToken () для чтения каждой строки json как токена. Проверьте каждый токен и обработайте соответственно
JsonFactory jasonFactory = new JsonFactory(); JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json")); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { //get the current token String fieldname = jsonParser.getCurrentName(); if ("name".equals(fieldname)) { //move to next token jsonParser.nextToken(); System.out.println(jsonParser.getText()); } }
Давайте посмотрим JsonParser в действии. Создайте файл Java-класса с именем JacksonTester в C: \> Jackson_WORKSPACE .
Файл: JacksonTester.java
импорт java.io.File; импорт java.io.IOException; импорт java.util.Map; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; открытый класс JacksonTester { public static void main (String args []) { Тестер JacksonTester = новый тестер JacksonTester (); пытаться { JsonFactory jsonFactory = new JsonFactory (); JsonGenerator jsonGenerator = jsonFactory.createGenerator (новый файл ( "student.json"), JsonEncoding.UTF8); jsonGenerator.writeStartObject (); jsonGenerator.writeStringField ("имя", "Махеш Кумар"); jsonGenerator.writeNumberField ("age", 21); jsonGenerator.writeBooleanField («подтверждено», false); jsonGenerator.writeFieldName ( "метки"); jsonGenerator.writeStartArray (); // [ jsonGenerator.writeNumber (100); jsonGenerator.writeNumber (90); jsonGenerator.writeNumber (85); jsonGenerator.writeEndArray (); jsonGenerator.writeEndObject (); jsonGenerator.close (); // результат student.json // { // "имя": "Махеш Кумар", // "возраст": 21, // «проверено»: ложь, // "отметки": [100,90,85] //} JsonParser jsonParser = jsonFactory.createParser (новый файл ("student.json")); while (jsonParser.nextToken ()! = JsonToken.END_OBJECT) { // получить текущий токен String fieldname = jsonParser.getCurrentName (); if ("name" .equals (fieldname)) { // перейти к следующему токену jsonParser.nextToken (); System.out.println (jsonParser.getText ()); } если ( "возраст" .equals (имя_поль)) { // перейти к следующему токену jsonParser.nextToken (); System.out.println (jsonParser.getNumberValue ()); } если ( "проверенный" .equals (имя_поль)) { // перейти к следующему токену jsonParser.nextToken (); System.out.println (jsonParser.getBooleanValue ()); } если ( "знаки" .equals (имя_поль)) { // перейти к [ jsonParser.nextToken (); // цикл до токена, равного "]" while (jsonParser.nextToken ()! = JsonToken.END_ARRAY) { System.out.println (jsonParser.getNumberValue ()); } } } } catch (JsonParseException e) { e.printStackTrace (); } catch (JsonMappingException e) { e.printStackTrace (); } catch (IOException e) { e.printStackTrace (); } } }
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Jackson_WORKSPACE>javac JacksonTester.java
Теперь запустите jacksonTester, чтобы увидеть результат:
C:\Jackson_WORKSPACE>java JacksonTester
Проверьте вывод