Рубрики
Без рубрики

Преобразование объектов Java (POJO) В JSON и из него с помощью Gson

В этом уроке мы рассмотрим примеры того, как преобразовать объект Java (POJO) в JSON и как преобразовать JSON в объект Java с помощью Gson.

Автор оригинала: Selena Hocevar.

Вступление

Формат JSON-один из самых популярных способов сериализации данных. Знание того, как читать и писать, является важным навыком для любого программиста. Существует несколько библиотек Java, которые могут анализировать JSON, но в этом уроке мы сосредоточимся на проекте с открытым исходным кодом, разработанном Google, под названием GSON.

GSON – это облегченная библиотека Java, которая обеспечивает функциональность сериализации/десериализации. Что отличает GSON , так это его поддержка Универсальных типов , которая ограничена некоторыми, но не всеми альтернативными библиотеками.

Примечание: Если вы не знакомы с дженериками и почему это так важно – не стесняйтесь прочитать наше Руководство по пониманию дженериков Java .

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


    com.google.code.gson
    gson
    ${version}

Или, если вы используете Gradle, вы можете добавить:

compile group: 'com.google.code.gson', name: 'gson', version: ${version}

Создание пользовательского класса

Давайте создадим пользовательский класс, который мы сначала сериализуем в JSON и в который мы десериализуем из JSON – Студент :

public class Student {
    private String firstName;
    private String lastName;
    private int studentID;
    private String email;
    private List courses;
    private FINANCE_TYPE financeType;

 	// Getters, setters, constructor, toString()
}

Для нашего Студента у нас дополнительно есть перечисление , представляющее, находятся ли они в бюджете ( СУБСИДИРУЮТСЯ ) или нет ( НЕСУБСИДИРОВАННЫЕ ):

public enum FINANCE_TYPE {
    SUBSIDIZED, UNSUBSIDIZED
}

Преобразуйте объект Java в объект JSON с помощью GSON

Теперь, когда мы определили наш класс, давайте создадим его экземпляр и сериализуем его в эквивалентное представление JSON. Мы сделаем это с помощью метода toJSON () , который принимает объект в качестве аргумента и возвращает представление этого объекта в формате JSON:

// Defining courses
List physicsCourses = Arrays.asList("Physics 8.01", "Physics 8.012");
List musicCourses = Arrays.asList("Jazz", "Blues");
 
// Instantiating students
Student max = new Student("Max", "Tegmark", 1254, "[email protected]", physicsCourses, FINANCE_TYPE.SUBSIDIZED);
Student amy = new Student("Amy", "Winehouse", 1328, "[email protected]", musicCourses, FINANCE_TYPE.SUBSIDIZED);

// Instantiating Gson
Gson gson = new Gson();

// Converting POJO to JSON
String maxJson = gson.toJson(max);
String amyJson = gson.toJson(amy);

System.out.println(maxJson);
System.out.println(amyJson);

Это преобразует наши POJO в строки JSON, которые при печати приводят к:

{"firstName":"Max","lastName":"Tegmark","studentID":1254,"email":"[email protected]","courses":["Physics 8.01","Physics 8.012"],"financeType":"SUBSIDIZED"}
{"firstName":"Amy","lastName":"Winehouse","studentID":1328,"email":"[email protected]","courses":["Jazz","Blues"],"financeType":"SUBSIDIZED"}

Преобразование строки JSON в объект Java

Чтобы обратить этот процесс вспять и сопоставить объект JSON с POJO, мы будем использовать метод FromJSON () . Он принимает строку JSON или a Считыватель и класс или/| Введите токен .

Давайте сначала взглянем на первое:

String maxJson = "{\"firstName\":\"Max\",\"lastName\":\"Tegmark\",\"studentID\":1254,\"email\":\"[email protected]\",\"courses\":[\"Physics 8.01\",\"Physics 8.012\"],\"financeType\":\"SUBSIDIZED\"}";

Gson gson = new Gson();
Student max = gson.fromJson(maxJson, Student.class);

System.out.println(max);

Это создает экземпляр и заполняет объект max данными из объекта JSON:

Student{firstName='Max', lastName='Tegmark', studentID=1254, email='[email protected]', courses=[Physics 8.01, Physics 8.012], financeType=SUBSIDIZED}

Преобразование файла JSON в объект Java

Теперь мы, возможно, не будем работать с JSON в строковом формате – нам часто приходится читать файлы JSON . Метод FromJSON() принимает экземпляр Reader , который мы также можем использовать для предоставления данных JSON.

Давайте переместим данные Эми в файл amy.json :

{
  "firstName":"Amy",
  "lastName":"Winehouse",
  "studentID":1328,
  "email":"[email protected]",
  "courses":[
    "Jazz",
    "Blues"
  ],
  "financeType":"SUBSIDIZED"
}

Теперь мы можем использовать Reader , например FileReader , чтобы прочитать этот файл и использовать его для ввода вместо строки. Кроме того, вместо использования Student.class , мы предоставляем Тип . Этот Тип извлекается из Gson TypeToken , что во многом аналогично ссылке Джексона На тип :

// Instantiate FileReader for amy.json
Reader input = new FileReader("./src/main/resources/amy.json");
//Instantiate Gson
Gson gson = new Gson();
// Create a Type via TypeToken for the Student class
Type type = new TypeToken(){}.getType();
// Read the `input` and cast into `type`
Student amy = gson.fromJson(input, type);
// Print result
System.out.println(amy);

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Это, безусловно, также создает экземпляры и заполняет наш Студент POJO:

Student{firstName='Amy', lastName='Winehouse', studentID=1328, email='[email protected]', courses=[Jazz, Blues], financeType=SUBSIDIZED}

Компактная и красивая печать

По умолчанию GSON печатает JSON в компактном формате, который мы могли видеть ранее:

{"firstName":"Max","lastName":"Tegmark","studentID":1254,"email":"[email protected]","courses":["Physics 8.01","Physics 8.012"],"financeType":"SUBSIDIZED"}
{"firstName":"Amy","lastName":"Winehouse","studentID":1328,"email":"[email protected]","courses":["Jazz","Blues"],"financeType":"SUBSIDIZED"}

Между именами полей и их значениями, полями объектов и объектами в массивах нет пробелов. Кроме того, нет ни одной новой строки . Если скопировать в виде строки – \n (новые строки) будут присутствовать, однако, это компактное представление является проблемой для чтения.

Мы можем довольно легко включить красивую печать с помощью Gson. При создании экземпляра Gson вместо вызова пустого конструктора по умолчанию – мы можем использовать конструктор GsonBuilder() :

Gson gson = new GsonBuilder().setPrettyPrinting().create();

Теперь мы можем использовать экземпляр gson почти так же, как и раньше:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String amyJson = gson.toJson(amy);
System.out.println(amyJson);

Хотя, на этот раз, при печати – строка JSON довольно-печать включена включена :

{
  "firstName": "Amy",
  "lastName": "Winehouse",
  "studentID": 1328,
  "email": "[email protected]",
  "courses": [
    "Jazz",
    "Blues"
  ],
  "financeType": "SUBSIDIZED"
}

Присвоение имен полям JSON с помощью @SerializedName

Сериализация обычно используется для передачи данных между службами – в первую очередь, через API REST. При работе с различными службами, командами или даже языками, которые обрабатывают предоставляемые нами данные, мы можем захотеть изменить сериализованные имена определенных полей в соответствии с более широко принятыми стандартами или стандартами определенной службы, которая будет обрабатывать предоставляемые нами данные.

Например, мы можем предоставлять данные JSON из службы Java в службу Python. Соглашения об именах Java следуют camelCase , в то время как соглашения об именах Python следуют нижним регистром_высокие баллы для неконстант и классов.

Зная, что мы будем предоставлять наши данные службе или лицу, которые могут захотеть использовать другие соглашения, мы можем изменить сериализованные имена наших полей на не соответствующие тем, которые указаны в нашем POJO, с помощью @SerializedName аннотации:

public class Student {
    @SerializedName("first_name")
    private String firstName;
    @SerializedName("last_name")
    private String lastName;
    @SerializedName("student_id")
    private int studentID;
    @SerializedName("student_email")
    private String email;
    @SerializedName("student_courses")
    private List courses;
    @SerializedName("student_finance_type")
    private FINANCE_TYPE financeType;

 	// Getters, setters, constructor, toString()
}

Теперь при сериализации эти имена будут использоваться вместо наших имен полей:

String amyJson = gson.toJson(amy);
System.out.println(amyJson);

Что приводит к:

{
  "first_name": "Amy",
  "last_name": "Winehouse",
  "student_id": 1328,
  "student_email": "[email protected]",
  "student_courses": [
    "Jazz",
    "Blues"
  ],
  "student_finance_type": "SUBSIDIZED"
}

Это также работает наоборот – если мы получим JSON с именем и наш Студент POJO имеет имя , сопоставленное с Именем , мы десериализуем это просто отлично:

String input = "{\"first_name\":\"Amy\",\"last_name\":\"Winehouse\",\"student_id\":1328,\"student_email\":\"[email protected]\",\"student_courses\":[\"Jazz\",\"Blues\"],\"student_finance_type\":\"SUBSIDIZED\"}";
Gson gson = new Gson();
Student amy = gson.fromJson(input, Student.class);
System.out.println(amy);

Это приводит к:

Student{firstName='Amy', lastName='Winehouse', studentID=1328, email='[email protected]', courses=[Jazz, Blues], financeType=SUBSIDIZED}

Вывод

В этом уроке мы рассмотрели, как преобразовать объект Java в объект JSON с помощью метода Gson toJSON () , а также как преобразовать объект JSON в объект Java с помощью метода Gson FromJSON () .

Мы также изучили, как включить красивую печать, а также изменить сериализованные имена полей.