Автор оригинала: 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 Listcourses; private FINANCE_TYPE financeType; // Getters, setters, constructor, toString() }
Для нашего Студента
у нас дополнительно есть перечисление , представляющее, находятся ли они в бюджете ( СУБСИДИРУЮТСЯ
) или нет ( НЕСУБСИДИРОВАННЫЕ
):
public enum FINANCE_TYPE { SUBSIDIZED, UNSUBSIDIZED }
Преобразуйте объект Java в объект JSON с помощью GSON
Теперь, когда мы определили наш класс, давайте создадим его экземпляр и сериализуем его в эквивалентное представление JSON. Мы сделаем это с помощью метода toJSON ()
, который принимает объект в качестве аргумента и возвращает представление этого объекта в формате JSON:
// Defining courses ListphysicsCourses = 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 Listcourses; @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 ()
.
Мы также изучили, как включить красивую печать, а также изменить сериализованные имена полей.