☕ Преобразуем массив JSON в массив Java или список с помощью Jackson

Вступление

В этой статье мы преобразуем массив JSON в массив Java и список Java с помощью Jackson.

Поскольку мы используем Jackson, вам придется добавить его в свой проект. Если вы используете Maven, это тоже очень просто:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.2</version>
</dependency>

Или, если вы используете Gradle:

compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.2'

Поскольку мы сопоставляем JSON с нашими объектами, давайте продолжим и опишем POJO:

public class Language {

    private String name;
    private String description;

Читаем JSON из строки

Прочитаем JSON из строки. Строка содержит массив языков программирования с краткими описаниями:

String json = "[{\"name\": \"Java\", \"description\": \"Java is a class-based, object-oriented programming language.\"},{\"name\": \"Python\", \"description\": \"Python is an interpreted, high-level and general-purpose programming language.\"}, {\"name\": \"JS\", \"description\": \"JS is a programming language that conforms to the ECMAScript specification.\"}]";

Используя класс ObjectMapper из Jackson, мы легко можем считывать значения и сопоставлять их с объектом или массивом объектов. Мы используем метод readValue(), передавая содержимое JSON и класс, с которым мы хотели бы сопоставить. Поскольку мы сопоставляем с массивом языков, мы также укажем это в методе readValue():

final ObjectMapper objectMapper = new ObjectMapper();
Language[] langs = objectMapper.readValue(json, Language[].class);

Кроме того, вы можете извлечь значения непосредственно в список, используя TypeReference:

List<Language> langList = objectMapper.readValue(json, new TypeReference<List<Language>>(){});

Вы можете преобразовать массив в список по-другому. Например так:

List<Language> langList = new ArrayList(Arrays.asList(langs));

Напечатаем значения:

langList.forEach(x -> System.out.println(x.toString()));

Результат:

Language{name='Java', description='Java is a class-based, object-oriented programming language.'}
Language{name='Python', description='Python is an interpreted, high-level and general-purpose programming language.'}
Language{name='JS', description='JS is a programming language that conforms to the ECMAScript specification.'}

Читаем JSON из файла

Зачастую содержимое поступает из файла. В таком случае мы просто предоставляем файл методу readValue():

final ObjectMapper objectMapper = new ObjectMapper();
List<Language> langList = objectMapper.readValue(
        new File("langs.json"), 
        new TypeReference<List<Language>>(){});

langList.forEach(x -> System.out.println(x.toString()));

Файл langs.json содержит следующее:

[
  {
    "name": "Java",
    "description": "Java is a class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible."
  },
  {
    "name": "Python",
    "description": "Python is an interpreted, high-level and general-purpose programming language. Created by Guido van Rossum and first released in 1991."
  },
  {
    "name": "JS",
    "description": "JS is a programming language that conforms to the ECMAScript specification. JavaScript is high-level, often just-in-time compiled, and multi-paradigm."
  }
]

Наш результат:

Language{name='Java', description='Java is a class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.'}
Language{name='Python', description='Python is an interpreted, high-level and general-purpose programming language. Created by Guido van Rossum and first released in 1991.'}
Language{name='JS', description='JS is a programming language that conforms to the ECMAScript specification. JavaScript is high-level, often just-in-time compiled, and multi-paradigm.'}

Заключение

В этой статье мы использовали Jackson для анализа и сопоставления значений из строки и файла JSON в массив и список Java.

Это можно сделать с помощью метода readValue(), указав содержимое JSON (строка или файл) и указания POJO, с которым мы будем сравнивать.

Ответить