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

Пример учебника по Gson Разбор JSON

Пример Учебника По Gson. Json Разбирает JSON. Анализатор Gson для чтения из файла, вложенные объекты, Gson Maven Jar, GsonBuilder, JsonReader, JsonToken, Потоковый код API

Автор оригинала: 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.

Рекомендации:

Google-Gson в Коде Google Руководство пользователя Gson