Учебники

Джексон — потоковое API

Потоковый API читает и записывает содержимое JSON как отдельные события. JsonParser читает данные, тогда как JsonGenerator записывает данные. Это самый мощный подход из трех, с минимальными накладными расходами и самый быстрый в операциях чтения / записи. Это аналог синтаксического анализатора Stax для XML.

В этой статье мы продемонстрируем использование потоковых API Джексона для чтения и записи данных JSON. Потоковый API работает с концепцией токена, и с каждой деталью Json нужно обращаться осторожно. Ниже приведены два класса, которые мы будем использовать в примерах:

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

Проверьте вывод