Jackson: пример потоковой обработки

Библиотека Jackson позволяет читать и записывать данные в формате JSON с помощью высокопроизводительного API потоковой обработки Jackson. Документацию можно найти на официальном сайте проекта. Там же описаны и все преимущества работы с потоковой обработкой.

API потоковой обработки Jackson является высокопроизводительным, быстрым и удобным способом работы с данными в формате JSON, но в то же время он довольно сложен, потому что разработчик вынужден обрабатывать каждую часть JSON документа.

В данном руководстве мы рассмотрим примеры использования API потоковой обработки Jackson для чтения и записи данных в формате JSON с помощью специальных объектов:

  • JsonGenerator — для генерации JSON
  • JsonParser — для чтения JSON

JsonGenerator

В этом примере мы будем использовать объект типа JsonGenerator для записи в JSON файл пары «ключ-значение», а также поля с массивом значений. Исходный код сопровождается подробными комментариями, которые описывают выполняемые действия.

package ru.j4web.examples.java.json.jacksonjsongeneratorexample;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;

public class JacksonJsonGeneratorExample {

    private static final String FILENAME = "c:\Projects\J4Web.Ru\Src\"
            + "JavaJSON\JacksonJsonGeneratorExample\file.json";

    public static void main(String[] args) {
        JsonFactory jsonFactory = new JsonFactory();
        try (JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(
                new File(FILENAME), JsonEncoding.UTF8)) {
            // Начинаем записывать объект в JSON файл -> {
            jsonGenerator.writeStartObject();
            // Записываем первую пару ключ-значение -> "name": "j4web"
            jsonGenerator.writeStringField("name", "j4web");
            // Записываем вторую пару ключ-значение -> "age": 2
            jsonGenerator.writeNumberField("age", 2);
            // Записываем только ключ -> "messages":
            jsonGenerator.writeFieldName("messages");
            // Начинаем запись массива значений -> [
            jsonGenerator.writeStartArray();
            // Записываем массив значений -> "msg 1", "msg 2", "msg 3"
            jsonGenerator.writeString("msg 1");
            jsonGenerator.writeString("msg 2");
            jsonGenerator.writeString("msg 3");
            // Заканчиваем записывать массив значений -> ]
            jsonGenerator.writeEndArray();
            // Заканчиваем запись объекта в JSON файл
            jsonGenerator.writeEndObject();
            // Сохраняем изменения в файл
        } catch (IOException ex) {
            Logger.getLogger(JacksonJsonGeneratorExample.class.getName())
                    .log(Level.SEVERE, null, ex);
        }
    }
}
{
    "name":"j4web",
    "age":2,
    "messages":
    [
        "msg 1",
        "msg 2",
        "msg 3"
    ]
}

JsonParser

Как упоминалось ранее,  объект типа JsonParser применяется для чтения данных в формате JSON.

Концепция токена (token)

При потоковой обработке данных каждая JSON строка рассматривается как токен (token), каждый из которых должен обрабатываться индивидуально. Например, если мы имеем следующие JSON данные:

{
    "name": "j4web"
}

Тогда в качестве токенов будут рассматриваться:

  1. "{"
  2. "name"
  3. "j4web"
  4. "}"
package ru.j4web.examples.java.json.jacksonjsonparserexample;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;

public class JacksonJsonParserExample {

    private static final String FILENAME = "c:\Projects\J4Web.Ru\Src\"
            + "JavaJSON\JacksonJsonParserExample\file.json";

    public static void main(String[] args) {
        JsonFactory jsonFactory = new JsonFactory();
        try (JsonParser jsonParser = jsonFactory.createJsonParser(
                new File(FILENAME))) {
            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                String fieldName = jsonParser.getCurrentName();
                // Если текущий объект не имеет имени, то переходим к
                // следующему токену. Это может быть в случае таких токенов
                // как "{", "[", "}", "]" и так далее
                if(null == fieldName) {
                    continue;
                }
                switch (fieldName) {
                    case "name":
                        // Текущий токен - name
                        // Получаем значение и отображаем его - j4web
                        jsonParser.nextToken();
                        System.out.println(jsonParser.getText());
                        break;
                    case "age":
                        // Текущий токен - age
                        // Получаем значение и отображаем его - 2
                        jsonParser.nextToken();
                        System.out.println(jsonParser.getIntValue());
                        break;
                    case "messages":
                        // Текущий токен - messages
                        // Берем следующий токен - [
                        jsonParser.nextToken();
                        // Мы знаем, что значение является массивом
                        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
                            // Отображаем в цикле все имеющиеся сообщения
                            System.out.println(jsonParser.getText());
                        }
                        break;
                    default:
                        break;
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(JacksonJsonParserExample.class.getName())
                    .log(Level.SEVERE, null, ex);
        }
    }
}
j4web
2
msg 1
msg 2
msg 3

Аналогичный подход используется при потоковой обработке XML документов средствами библиотеки Gson, пример есть на нашем сайте.

Полезная информация

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*