Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Как преобразовать объект JSON в объект Java с помощью Джексона
В этом руководстве мы рассмотрим, как преобразовать объект JSON в объект Java с помощью Jackson [https://github.com/FasterXML/jackson], чрезвычайно популярной библиотеки привязки данных для Java. В частности, мы будем работать с этим объектом JSON: > Поскольку мы работаем с внешней библиотекой,
Время чтения: 2 мин.
В этом руководстве мы рассмотрим, как преобразовать объект JSON в объект Java с помощью Jackson , чрезвычайно популярной библиотеки привязки данных для Java.
В частности, мы будем работать с этим объектом JSON:
Поскольку мы работаем с внешней библиотекой, давайте добавим зависимость. Если вы используете Maven, вы можете добавить его с помощью:
com.fasterxml.jackson.core jackson-databind 2.11.3
Или, если вы используете Gradle, вы можете добавить:
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.3'
Создание настраиваемого класса
После этого мы можем создать простой настраиваемый класс для размещения Employee из содержимого JSON:
public class Employee < private String name; private POSITION position; private Listskilltree; private Address address; // Constructors, Getters, Setters, toString() >
Примечание. Если мы хотим, чтобы Джексон мог автоматически связывать свойства нашего класса и свойства в объекте JSON, они должны иметь одинаковые имена. Мы расскажем, как изменить это поведение чуть позже. Кроме того, вам понадобится пустой конструктор для создания экземпляра.
Здесь мы используем перечисление POSITION , которое выглядит так:
public enum POSITION
И объект Address
public class Address < private String street; private String streetNo; // Constructors, Getters and Setters, toString() >
Преобразование объекта JSON в объект Java
Центральный класс Джексона — ObjectMapper . Это основной API для привязки данных к объектам, и вы все время будете использовать его с Джексоном.
Чтобы преобразовать объект JSON в объект Java, вы будете использовать метод readValue() ObjectMapper , который десериализует его в предоставленную ссылку на класс:
String json = " < \"name\":\"David\", \"position\":\"SOFTWARE_ENGINEER\", \"skilltree\":[ \"Java\", \"Python\", \"JavaScript\" ], \"address\":< \"street\":\"Street\", \"streetNo\":\"123\" >>"; // ObjectMapper instantiation ObjectMapper objectMapper = new ObjectMapper(); // Deserialization into the `Employee` class Employee employee = objectMapper.readValue(json, Employee.class); // Print information System.out.println(employee);
Выполнение этого кода приведет к:
Employee>
Другой способ сообщить Джексону, в какой класс следует десериализоваться, — использовать TypeReference :
Employee employee = objectMapper.readValue(json, new TypeReference()<>);
Печать этого employee также приведет к:
Employee>
Оба они создают данный объект и вызывают один и тот же процесс десериализации. Таким образом, единственная разница между этими двумя вызовами заключается в том, делаете ли вы статическую или динамическую ссылку на тип.
Licensed under CC BY-NC-SA 4.0
Преобразование из json в объект Java
В таких случаях идете на этот прекрасный ресурс: http://www.jsonschema2pojo.org/ Создаете себе POJO для ваших классов :
public class Cast < @SerializedName("fullName") @Expose private String fullName; @SerializedName("role") @Expose private String role; public String getFullName() < return fullName; >public void setFullName(String fullName) < this.fullName = fullName; >public String getRole() < return role; >public void setRole(String role) < this.role = role; >> package com.example; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Director < @SerializedName("fullName") @Expose private String fullName; public String getFullName() < return fullName; >public void setFullName(String fullName) < this.fullName = fullName; >> package com.example; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Movie < @SerializedName("name") @Expose private String name;@SerializedName("year") @Expose private Integer year; @SerializedName("description") @Expose private String description; @SerializedName("director") @Expose private Director director; @SerializedName("cast") @Expose private Listcast = null; public String getName() < return name; >public void setName(String name) < this.name = name; >public Integer getYear() < return year; >public void setYear(Integer year) < this.year = year; >public String getDescription() < return description; >public void setDescription(String description) < this.description = description; >public Director getDirector() < return director; >public void setDirector(Director director) < this.director = director; >public List getCast() < return cast; >public void setCast(List cast) < this.cast = cast; >> package com.example; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Response < @SerializedName("movie") @Expose private Listmovie = null; public List getMovie() < return movie; >public void setMovie(List movie)
Ну и потом все просто (надеюсь у Вас добавлены все необходимые зависимости добавляющие Gson в Ваш проект)
Gson gson = new Gson(); Response response = gson.fromJson(yourJson, Response.class); List movies = response.getMovie();
Как конвертировать очень большой json в Java объект?
Я получаю с бэкенда json и перевожу его в объект с помощью Gson. Вот так:
public void saveData(JsonObject data) < Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer()).create(); Structure structure = gson.fromJson(data.get("structure").toString(), Structure.class); //работаю дальше со structure >
Но иногда api возвращает очень большой json (около 50 МБ), что вызывает out of memory exception.
Как выглядит Structure:
@Parcel(value = Parcel.Serialization.BEAN, analyze = ) public class Structure extends RealmObject < @SerializedName("id") @PrimaryKey @Expose @Index public int id; @SerializedName("date") @Expose public String date; @SerializedName("notes") @Expose @ParcelPropertyConverter(RealmListParcelConverter.class) public RealmListnotes; //другие поля
Основная проблема в поле "notes" - оно содержит около 80% всего файла json, который получаю из api.
Как можно преобразовать такой большой json в объект Java? Я подумывал о том, чтобы разделить notes на несколько частей, а затем по очереди просто заполнить список, но я не знаю, возможно ли это вообще и как.
- Вопрос задан более года назад
- 199 просмотров
Java Blog
В этом посте будет описано как использовать Jackson 2.x чтобы преобразовать Java объекты в/из JSON.
Преобразовать объект в JSON
Используйте writeValue(. ) для преобразования Java объекта в JSON файл.
Используйте writeValueAsString(. ) для преобразования Java объекта в JSON строку.
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; public class Main < public static void main(String[] args)< ObjectMapper mapper = new ObjectMapper(); Animal animal = new Animal(); animal.setName("cat"); try < // Java объект в JSON файл mapper.writeValue(new File("/home/myuser/animals.json"), animal); // Java объект в JSON строку String jsonString = mapper.writeValueAsString(animal); System.out.println(jsonString); > catch (Exception e) < System.out.println(e.getMessage()); >> >
Простой Java класс для преобразования в JSON.
public class Animal < private String name; public Animal()<>public void setName(String name) < this.name = name; >public String getName() < return this.name; >>
Преобразовать объект из JSON
Используйте readValue(. ) для преобразования Java объекта из JSON.
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.net.URL; public class FromJSON < public static void main(String[] args)< ObjectMapper mapper = new ObjectMapper(); try < // Java объект из JSON файла Animal animal = mapper.readValue(new File("/home/alex/animals.json"), Animal.class); // Java объект из JSON файла по URL (если данный файл доступен по указанному URL) // Animal animalFromWeb = mapper.readValue(new URL("http://example.com/api/animals.json"), Animal.class); // Java объект из JSON строки Animal animalFromString = mapper.readValue("", Animal.class); System.out.println("Name of animal from JSON file: "+animal.getName()); System.out.println("Name of animal from JSON string: "+animalFromString.getName()); > catch (Exception e) < System.out.println(e.getMessage()); >> >
Name of animal from JSON file: cat Name of animal from JSON string: dog

- Получить ссылку
- Электронная почта
- Другие приложения
Комментарии
Отправить комментарий
Популярные сообщения из этого блога
Методы класса Object в Java

Класс Object является корнем иерархии классов. У каждого класса есть Object как суперкласс. Все объекты, включая массивы, реализуют методы этого класса. Методы класса Object Метод getClass() public final Class getClass() Возвращает класс времени исполнения (runtime class) этого Object. Возвращенный объект Class - это объект, который заблокирован статическими синхронизированными методами представленного класса. Фактический тип результата - Class где |X| заменяется статическим типом выражения, для которого вызывается getClass. Например, в этом фрагменте кода не требуется приведение: Number n = 0; Class c = n.getClass(); Метод getClass() возвращает: Объект Class, представляющий класс времени исполнения (runtime class) этого объекта. Метод hashCode public int hashCode() Возвращает значение хэш-кода для объекта. Этот метод поддерживается для использования хэш-таблиц, таких как те, что предоставляются HashMap. Основной контракт метода hashCo?>
Как получить текущий timestamp в Java

Чтобы получить текущий timestamp в Java : package main; import java.sql.Timestamp; public class Main < public static void main(String[] args)< Timestamp timestamp = new Timestamp(System.currentTimeMillis()); System.out.println(timestamp); >> Вывод: 2019-10-03 10:09:21.61 Вот еще два более подробных примера как получить текущий timestamp в Java: 1. java.sql.Timestamp Есть два метода получить текущий java.sql.Timestamp package main; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Date; public class Main < private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss"); public static void main(String[] args) < // Метод 1 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); System.out.println(timestamp); // Метод 2 - через Date Date date = new Date(); System.out.println(new Timestamp(date.getTime()
Основные опции JVM для повышения производительности и отладки

Если вы являетесь Java-разработчиком или администратором Java приложения, вам поможет в работе знание того, что означают опции JVM, а также их важность и как они влияют на ваше приложение. Обзор параметров JVM Если говорить о параметрах JVM, то есть три типа параметров, которые вы можете включить в JVM: стандартные, нестандартные и расширенные параметры. Если вы используете расширенную опцию, вы всегда используете опцию с -XX. Точно так же, если вы применяете нестандартную опцию, вы используете -X. Стандартные опции ничего не добавляют к опции. Какие параметры JVM используются вашим приложением? Если приложение работает в Linux, вы можете использовать ps -ef | grep java для идентификации процесса Java и просмотра параметров JVM, напечатанных как аргументы процесса. Если в системе выполняется более одного Java-процесса, вам может потребоваться использовать ключевое слово, уникальное для вашего Java-приложения. Если ваш аргумент слишком длинный, попробуйте использовать ps