Вступление
В этой статье мы преобразуем массив JSON в массив Java и список Java с помощью Джексона .
Поскольку мы используем Джексона, вам придется добавить его в свой проект. Если вы используете 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;
// Getters, setters and toString() method
Чтение 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
, легко читать значения и сопоставлять их с
объектом или массивом объектов. Мы просто используем метод readValue()
, передавая содержимое JSON и класс, которому мы хотим сопоставить.
Поскольку мы сопоставляем массив Language
, мы также укажем это в
readValue()
:
// It's advised to use ObjectMapper as a singleton and reuse the instance
final ObjectMapper objectMapper = new ObjectMapper();
Language[] langs = objectMapper.readValue(json, Language[].class);
В качестве альтернативы вы можете извлечь значения непосредственно в
список, используя TypeReference
Джексона:
List<Language> langList = objectMapper.readValue(json, new TypeReference<List<Language>>(){});
Без использования TypeReference<>
, который рекомендуется, вы можете
преобразовать массив в
список любым другим
подходом, имеющимся в вашем распоряжении, например:
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 из файла
Мы не всегда имеем дело с JSON в строковом формате. Часто содержимое
поступает из File
. К счастью, Джексон делает эту задачу такой же
простой, как и предыдущую, мы просто передаем File
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.'}
Заключение
В этой статье мы использовали Джексона для анализа и отображения значений из строки и файла JSON в массив и список Java.
Это делается с помощью readValue()
, путем указания содержимого JSON
(строки или файла) и указания POJO, с которым мы хотели бы сопоставить.