Автор оригинала: Pankaj Kumar.
Добро пожаловать в учебник по примерам Gson. В прошлом посте мы рассмотрели API Java JSON, и вы легко можете сказать, что его использовать неудобно. Независимо от того, нужно ли вам конвертировать JSON в объект Java или нет, вам нужно написать много кода, который тесно связан со структурой JSON.
Gson
Я начал искать какой-нибудь другой API-анализатор JSON, который может выполнить само преобразование, и нашел информацию о Google Gson. Gson-это открытый исходный код, и он часто используется при работе с JSON и Java. Gson использует отражение Java для предоставления простых методов преобразования JSON в java и наоборот.
Gson Maven
Вы можете скачать файл Gson jar с веб-сайта google code или, если вы используете maven, все, что вам нужно, это добавить его зависимость, как показано ниже.
com.google.code.gson gson 2.2.4
Gson-это очень мощный API, и он поддерживает универсальные приложения Java . API Gson также поддерживает стандартное преобразование объектов JSON в Java, если имена полей объектов такие же, как в json. Если мы хотим использовать другое имя для java bean и jason, то мы можем использовать аннотацию java @SerializedName и сопоставить переменные в JSON и классе Java.
Пример Gson
Давайте рассмотрим сложный пример Gson, который включает вложенный объект и массив в JSON, и мы сопоставим его со свойствами java-компонентов типа Список, Карта, Массив и т.д.
Давайте рассмотрим сложный пример Gson, который включает вложенный объект и массив в JSON, и мы сопоставим его со свойствами java-компонентов типа Список, Карта, Массив и т.д.
{
"empID": 100,
"name": "David",
"permanent": false,
"address": {
"street": "BTM 1st Stage",
"city": "Bangalore",
"zipcode": 560100
},
"phoneNumbers": [
123456,
987654
],
"role": "Manager",
"cities": [
"Los Angeles",
"New York"
],
"properties": {
"age": "28 years",
"salary": "1000 Rs"
}
}
Давайте создадим классы java bean для преобразования JSON в объект Java.
Давайте создадим классы java bean для преобразования JSON в объект Java.
package com.journaldev.json.model;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.google.gson.annotations.SerializedName;
public class Employee {
@SerializedName("empID")
private int id;
private String name;
private boolean permanent;
private Address address;
private long[] phoneNumbers;
private String role;
private List cities;
private Map properties;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isPermanent() {
return permanent;
}
public void setPermanent(boolean permanent) {
this.permanent = permanent;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public long[] getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(long[] phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("***** Employee Details *****\n");
sb.append("ID="+getId()+"\n");
sb.append("Name="+getName()+"\n");
sb.append("Permanent="+isPermanent()+"\n");
sb.append("Role="+getRole()+"\n");
sb.append("Phone Numbers="+Arrays.toString(getPhoneNumbers())+"\n");
sb.append("Address="+getAddress()+"\n");
sb.append("Cities="+Arrays.toString(getCities().toArray())+"\n");
sb.append("Properties="+getProperties()+"\n");
sb.append("*****************************");
return sb.toString();
}
public List getCities() {
return cities;
}
public void setCities(List cities) {
this.cities = cities;
}
public Map getProperties() {
return properties;
}
public void setProperties(Map properties) {
this.properties = properties;
}
}
Давайте создадим классы java bean для преобразования JSON в объект Java.
package com.journaldev.json.model;
public class Address {
private String street;
private String city;
private int zipcode;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getZipcode() {
return zipcode;
}
public void setZipcode(int zipcode) {
this.zipcode = zipcode;
}
@Override
public String toString(){
return getStreet() + ", "+getCity()+", "+getZipcode();
}
}
Вот программа java, показывающая пример Gson для анализа JSON.
Вот программа java, показывающая пример Gson для анализа JSON.
package com.journaldev.json.gson;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.journaldev.json.model.Address;
import com.journaldev.json.model.Employee;
public class EmployeeGsonExample {
public static void main(String[] args) throws IOException {
Employee emp = createEmployee();
// Get Gson object
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// read JSON file data as String
String fileData = new String(Files.readAllBytes(Paths
.get("employee.txt")));
// parse json string to object
Employee emp1 = gson.fromJson(fileData, Employee.class);
// print object data
System.out.println("\n\nEmployee Object\n\n" + emp1);
// create JSON String from Object
String jsonEmp = gson.toJson(emp);
System.out.print(jsonEmp);
}
public static Employee createEmployee() {
Employee emp = new Employee();
emp.setId(100);
emp.setName("David");
emp.setPermanent(false);
emp.setPhoneNumbers(new long[] { 123456, 987654 });
emp.setRole("Manager");
Address add = new Address();
add.setCity("Bangalore");
add.setStreet("BTM 1st Stage");
add.setZipcode(560100);
emp.setAddress(add);
List cities = new ArrayList();
cities.add("Los Angeles");
cities.add("New York");
emp.setCities(cities);
Map props = new HashMap();
props.put("salary", "1000 Rs");
props.put("age", "28 years");
emp.setProperties(props);
return emp;
}
}
Gson является основным классом, который предоставляет методы FromJSON() и toJSON() для преобразования. Для реализации по умолчанию мы можем создать этот объект напрямую или использовать класс GsonBuilder , который предоставляет полезные опции для преобразования, такие как красивая печать, соглашение об именовании полей, исключение полей, формат даты и т.д.
Когда вы запустите выше пример программы gson, мы получим следующий вывод для объекта java.
Employee Object
***** Employee Details *****
ID=100
Name=David
Permanent=false
Role=Manager
Phone Numbers=[123456, 987654]
Address=BTM 1st Stage, Bangalore, 560100
Cities=[Los Angeles, New York]
Properties={age=28 years, salary=1000 Rs}
*****************************
Вы можете видеть, как легко использовать Gson, и именно поэтому Gson является очень популярным java API для анализа JSON.
Приведенный выше пример Json синтаксического анализа JSON известен как Объектная модель , потому что весь JSON преобразуется в объект сразу. В большинстве случаев нам этого достаточно, но если ДЖЕЙСОН действительно огромен, и мы не хотим, чтобы все это было в памяти сразу, Gson также предоставляет Потоковый API .
Пример Gson Разбор JSON с использованием потокового API
Давайте рассмотрим пример Gson, где мы будем использовать потоковый API для преобразования объектов json в java.
Давайте рассмотрим пример Gson, где мы будем использовать потоковый API для преобразования объектов json в java.
package com.journaldev.json.gson;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.journaldev.json.model.Address;
import com.journaldev.json.model.Employee;
public class EmployeeGsonReader {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("employee.txt");
InputStreamReader isr = new InputStreamReader(is);
//create JsonReader object
JsonReader reader = new JsonReader(isr);
//create objects
Employee emp = new Employee();
Address add = new Address();
emp.setAddress(add);
List phoneNums = new ArrayList();
emp.setCities(new ArrayList());
emp.setProperties(new HashMap());
String key = null;
boolean insidePropertiesObj=false;
key = parseJSON(reader, emp, phoneNums, key, insidePropertiesObj);
long[] nums = new long[phoneNums.size()];
int index = 0;
for(Long l :phoneNums){
nums[index++] = l;
}
emp.setPhoneNumbers(nums);
reader.close();
//print employee object
System.out.println("Employee Object\n\n"+emp);
}
private static String parseJSON(JsonReader reader, Employee emp,
List phoneNums, String key, boolean insidePropertiesObj) throws IOException {
//loop to read all tokens
while(reader.hasNext()){
//get next token
JsonToken token = reader.peek();
switch(token){
case BEGIN_OBJECT:
reader.beginObject();
if("address".equals(key) || "properties".equals(key)){
while(reader.hasNext()){
parseJSON(reader, emp,phoneNums, key, insidePropertiesObj);
}
reader.endObject();
}
break;
case END_OBJECT:
reader.endObject();
if(insidePropertiesObj) insidePropertiesObj=false;
break;
case BEGIN_ARRAY:
reader.beginArray();
if("phoneNumbers".equals(key) || "cities".equals(key)){
while(reader.hasNext()){
parseJSON(reader, emp,phoneNums, key, insidePropertiesObj);
}
reader.endArray();
}
break;
case END_ARRAY:
reader.endArray();
break;
case NAME:
key = reader.nextName();
if("properties".equals(key)) insidePropertiesObj=true;
break;
case BOOLEAN:
if("permanent".equals(key)) emp.setPermanent(reader.nextBoolean());
else{
System.out.println("Unknown item found with key="+key);
//skip value to ignore it
reader.skipValue();
}
break;
case NUMBER:
if("empID".equals(key)) emp.setId(reader.nextInt());
else if("phoneNumbers".equals(key)) phoneNums.add(reader.nextLong());
else if("zipcode".equals(key)) emp.getAddress().setZipcode(reader.nextInt());
else {
System.out.println("Unknown item found with key="+key);
//skip value to ignore it
reader.skipValue();
}
break;
case STRING:
setStringValues(emp, key, reader.nextString(), insidePropertiesObj);
break;
case NULL:
System.out.println("Null value for key"+key);
reader.nextNull();
break;
case END_DOCUMENT:
System.out.println("End of Document Reached");
break;
default:
System.out.println("This part will never execute");
break;
}
}
return key;
}
private static void setStringValues(Employee emp, String key,
String value, boolean insidePropertiesObj) {
if("name".equals(key)) emp.setName(value);
else if("role".equals(key)) emp.setRole(value);
else if("cities".equals(key)) emp.getCities().add(value);
else if ("street".equals(key)) emp.getAddress().setStreet(value);
else if("city".equals(key)) emp.getAddress().setCity(value);
else{
//add to emp properties map
if(insidePropertiesObj){
emp.getProperties().put(key, value);
}else{
System.out.println("Unknown data found with key="+key+" value="+value);
}
}
}
}
Поскольку JSON является рекурсивным языком, нам необходимо рекурсивно вызывать наш метод синтаксического анализа для массива и вложенного объекта. JsonToken-это перечисление java , возвращаемое методом JsonReader next () , который мы можем использовать с операторами условной логики или переключения регистров для преобразования.
Из приведенного выше кода вы можете понять, что это непростая реализация, и если JSON действительно сложный, то этот код будет очень сложно поддерживать. Избегайте его использования до тех пор, пока не будет возможности использовать объектно-ориентированную модель.
Пример Gson для записи объекта в файл
Давайте посмотрим, как мы можем написать объект Employee с помощью Json Streaming API.
Давайте посмотрим, как мы можем написать объект Employee с помощью Json Streaming API.
package com.journaldev.json.gson;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Set;
import com.google.gson.stream.JsonWriter;
import com.journaldev.json.model.Employee;
public class EmployeeGsonWriter {
public static void main(String[] args) throws IOException {
Employee emp = EmployeeGsonExample.createEmployee();
//writing on console, we can initialize with FileOutputStream to write to file
OutputStreamWriter out = new OutputStreamWriter(System.out);
JsonWriter writer = new JsonWriter(out);
//set indentation for pretty print
writer.setIndent("\t");
//start writing
writer.beginObject(); //{
writer.name("id").value(emp.getId()); // "id": 123
writer.name("name").value(emp.getName()); // "name": "David"
writer.name("permanent").value(emp.isPermanent()); // "permanent": false
writer.name("address").beginObject(); // "address": {
writer.name("street").value(emp.getAddress().getStreet()); // "street": "BTM 1st Stage"
writer.name("city").value(emp.getAddress().getCity()); // "city": "Bangalore"
writer.name("zipcode").value(emp.getAddress().getZipcode()); // "zipcode": 560100
writer.endObject(); // }
writer.name("phoneNumbers").beginArray(); // "phoneNumbers": [
for(long num : emp.getPhoneNumbers()) writer.value(num); //123456,987654
writer.endArray(); // ]
writer.name("role").value(emp.getRole()); // "role": "Manager"
writer.name("cities").beginArray(); // "cities": [
for(String c : emp.getCities()) writer.value(c); //"Los Angeles","New York"
writer.endArray(); // ]
writer.name("properties").beginObject(); //"properties": {
Set keySet = emp.getProperties().keySet();
for(String key : keySet) writer.name("key").value(emp.getProperties().get(key));//"age": "28 years","salary": "1000 Rs"
writer.endObject(); // }
writer.endObject(); // }
writer.flush();
//close writer
writer.close();
}
}
Преобразование объекта java в JSON сравнительно проще, чем анализ с помощью API потоковой передачи Gson. По умолчанию JsonWriter пишет json в компактной форме, но мы можем установить отступ для красивой печати.
Это все для примера учебника Gson, дайте мне знать, если у вас возникнут какие-либо проблемы с ним. Скачайте проект по ссылке ниже и поиграйте с различными опциями, которые предоставляет Gson.
Рекомендации: