gson 解析json

Welcome to Gson Example Tutorial. In last post we looked at the Java JSON API and you can easily tell that it’s not convenient to use it. Whether you have to convert JSON to Java Object or otherwise, you need to write a lot of code that is tightly coupled with the JSON structure.

欢迎使用Gson示例教程。 在上一篇文章中,我们研究了Java JSON API ,您可以很容易地看出使用它并不方便。 无论您是否必须将JSON转换为Java Object,都需要编写大量与JSON结构紧密结合的代码。

格森 (Gson)

I started looking out for some other JSON parser API that can do the transformation itself and found about Google Gson. Gson is an open source code and it’s used a lot in working with JSON and Java. Gson uses Java Reflection to provide simple methods to convert JSON to java and vice versa.

我开始寻找其他可以自行完成转换的JSON解析器API,并找到了有关Google Gson的信息。 Gson是一个开放源代码,在JSON和Java中已被大量使用。 Gson使用Java Reflection提供简单的方法来将JSON转换为Java,反之亦然。

格森·Maven (Gson Maven)

You can download Gson jar file from google code website or if you are using maven then all you need is to add it’s dependency like below.

您可以从Google代码网站下载Gson jar文件,或者如果您使用的是maven,则只需添加它的依赖项,如下所示。

<dependencies><!--  Gson dependency --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.2.4</version></dependency>
</dependencies>

Gson is very powerful API and it supports Java Generics. Gson API also supports out of the box JSON to Java Object conversion if the object field names are same as in json. If we want to use different name for java bean and json, then we can use @SerializedName java annotation and map the variables in JSON and Java Class.

Gson是非常强大的API,它支持Java泛型 。 如果对象字段名称与json中的相同,则Gson API还支持将JSON转换为Java Object。 如果要为Java bean和json使用不同的名称,则可以使用@SerializedName java批注并在JSON和Java类中映射变量。

格森的例子 (Gson Example)

Let’s look at a complex Gson example that involves nested object and array in JSON and we will map it to java bean properties of type List, Map, Array etc.

让我们看一个复杂的Gson示例,该示例涉及JSON中的嵌套对象和数组,并将其映射到类型为List,Map,Array等的Java bean属性。

employee.txt

employee.txt

{"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"}
}

Let’s create the java bean classes to convert JSON to Java Object.

让我们创建Java Bean类以将JSON转换为Java Object。

Employee.java

Employee.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<String> cities;private Map<String, String> 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;}@Overridepublic 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<String> getCities() {return cities;}public void setCities(List<String> cities) {this.cities = cities;}public Map<String, String> getProperties() {return properties;}public void setProperties(Map<String, String> properties) {this.properties = properties;}
}

Address.java

Address.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;}@Overridepublic String toString(){return getStreet() + ", "+getCity()+", "+getZipcode();}
}

Here is the java program showing Gson example to parse JSON.

这是显示Gson示例以解析JSON的Java程序。

EmployeeGsonExample.java

EmployeeGsonExample.java

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 objectGson gson = new GsonBuilder().setPrettyPrinting().create();// read JSON file data as StringString fileData = new String(Files.readAllBytes(Paths.get("employee.txt")));// parse json string to objectEmployee emp1 = gson.fromJson(fileData, Employee.class);// print object dataSystem.out.println("\n\nEmployee Object\n\n" + emp1);// create JSON String from ObjectString 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<String> cities = new ArrayList<String>();cities.add("Los Angeles");cities.add("New York");emp.setCities(cities);Map<String, String> props = new HashMap<String, String>();props.put("salary", "1000 Rs");props.put("age", "28 years");emp.setProperties(props);return emp;}
}

Gson is the main class that exposes the methods fromJson() and toJson() for conversion. For default implementation, we can create this object directly or we can use GsonBuilder class that provide useful options for conversion such as pretty printing, field naming convention, excluding fields, date format etc.

Gson是主要类,它公开了fromJson()toJson()进行转换。 对于默认实现,我们可以直接创建此对象,也可以使用GsonBuilder类,该类提供了有用的转换选项,例如漂亮的打印,字段命名约定,排除字段,日期格式等。

When you will run above gson example program, we will get following output for java object.

当您在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}
*****************************

You can see how easy it is to use Gson and that’s why Gson is a very popular java API for JSON parsing.

您可以看到使用Gson多么容易,这就是为什么Gson是非常流行的JSON解析Java API的原因。

The above Gson example of JSON parsing is known as Object model because whole JSON is converted to object at once. Most of the times it’s enough for us but if JSON is really huge and we don’t want to have all of it in memory at once, Gson provides Streaming API too.

上面的JSON解析的Gson示例被称为对象模型,因为整个JSON会立即转换为对象。 在大多数情况下,这对我们来说已经足够了,但是如果JSON确实非常庞大并且我们不想一次将所有内容都存储在内存中,那么Gson也会提供Streaming API

Gson示例使用流API解析JSON (Gson Example Parse JSON using Streaming API)

Let’s see Gson example where we will use Streaming API for json to java object conversion.

让我们看一下Gson示例,在这里我们将使用Streaming API将json转换为java对象。

EmployeeGsonReader.java

EmployeeGsonReader.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 objectJsonReader reader = new JsonReader(isr);//create objectsEmployee emp = new Employee();Address add = new Address();emp.setAddress(add);List<Long> phoneNums = new ArrayList<Long>();emp.setCities(new ArrayList<String>());emp.setProperties(new HashMap<String, String>());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 objectSystem.out.println("Employee Object\n\n"+emp);}private static String parseJSON(JsonReader reader, Employee emp,List<Long> phoneNums, String key, boolean insidePropertiesObj) throws IOException {//loop to read all tokenswhile(reader.hasNext()){//get next tokenJsonToken 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 itreader.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 itreader.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 mapif(insidePropertiesObj){emp.getProperties().put(key, value);}else{System.out.println("Unknown data found with key="+key+" value="+value);}}}}

Since JSON is a recursive language, we need to call our parsing method recursively for array and nested object. JsonToken is java enum returned by JsonReader next() method that we can use with conditional logic or switch case statements for conversion.

由于JSON是一种递归语言,因此我们需要为数组和嵌套对象递归调用解析方法。 JsonToken是JsonReader next()方法返回的Java枚举 ,我们可以将其与条件逻辑一起使用或切换case语句进行转换。

From the code above, you can understand that it’s not an easy implementation and if the JSON is really complex, then this code will become very hard to maintain. Avoid using it until unless there is no way to use Object based model.

从上面的代码中,您可以了解到这不是一个简单的实现,并且如果JSON确实很复杂,那么此代码将很难维护。 除非没有办法使用基于对象的模型,否则请避免使用它。

将对象写入文件的Gson示例 (Gson Example to Write Object to File)

Let’s see how we can write Employee object using Gson Streaming API.

让我们看看如何使用Gson Streaming API编写Employee对象。

EmployeeGsonWriter.java

EmployeeGsonWriter.java

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 fileOutputStreamWriter out = new OutputStreamWriter(System.out);JsonWriter writer = new JsonWriter(out);//set indentation for pretty printwriter.setIndent("\t");//start writingwriter.beginObject(); //{writer.name("id").value(emp.getId()); // "id": 123writer.name("name").value(emp.getName()); // "name": "David"writer.name("permanent").value(emp.isPermanent()); // "permanent": falsewriter.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": 560100writer.endObject(); // }writer.name("phoneNumbers").beginArray(); // "phoneNumbers": [for(long num : emp.getPhoneNumbers()) writer.value(num); //123456,987654writer.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<String> 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 writerwriter.close();}}

Converting java object to JSON is comparatively easy than parsing with Gson streaming API. By default JsonWriter writes json in compact form but we can set indent for pretty printing.

与使用Gson流API进行解析相比,将Java对象转换为JSON相对容易。 默认情况下,JsonWriter以紧凑形式编写json,但我们可以设置缩进以进行漂亮的打印。

That’s all for Gson example tutorial, let me know if you face any issues with it. Download project from below link and play around with different options Gson provides.

这就是Gson示例教程的全部内容,如果您遇到任何问题,请告诉我。 从下面的链接下载项目,并尝试使用Gson提供的不同选项。

Download Google GSON Project下载Google GSON项目

References:

参考文献:

Google-Gson on Google Code
Gson User Guide

Google Code上的Google-Gson
Gson用户指南

翻译自: https://www.journaldev.com/2321/gson-example-tutorial-parse-json

gson 解析json

gson 解析json_Gson示例教程解析JSON相关推荐

  1. 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

    Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...

  2. OpenCV3源代码目录解析(算法模块解析 和 示例目录解析)

    OpenCV3源代码文件夹sources: • 3rdparty: 包含第三方库,如用视频解码用的 ffmpeg.jpg.png.tiff 等图片的解码库. • apps: 包含进行 Haar 分类器 ...

  3. gson生成jsonobject_GSON形式生成和解析json数据

    GSON 方式生成和解析 json 数据 客户端与服务器进行数据交互时, 常常需要将数据在服务器端将数据转化成字符串并在客户 端对 json 数据进行解析生成对象. 但是用 jsonObject 和 ...

  4. Android系统 (190)---Android:JSON 简介 amp; 解析方式 讲解(Gson、AS自带org.json、Jackson)

    Android:JSON 简介 & 解析方式 讲解(Gson.AS自带org.json.Jackson) 前言 现今最主流的数据交换格式 非 JSON莫属 今天,我将全面介绍 JSON &am ...

  5. 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析

    全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析 废话先说一点,算了.直接进入正题吧. 用例子说话: JSON数据: string json: " {" ...

  6. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  7. 单图像超分辨率重建示例代码解析

    昨天发了单图像超分辨率重建示例,今天来对里面主要的Python代码进行讲解,如果有补充或指正,欢迎大家在评论区留言.PS:这里的代码不要直接复制粘贴使用,由于注释的关系可能会报错,建议到示例给出的gi ...

  8. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  9. python解析response_python:解析requests返回的response(json格式)说明

    我就废话不多说了,大家还是直接看代码吧! import requests, json r = requests.get("http://192.168.207.160:9000/api/qu ...

最新文章

  1. Java短连接生成工具-思路
  2. 参加微软新技术预览大会
  3. dns服务器ip地址 常用列表
  4. 【SDCC 2016·杭州站】9月22日大数据实战专场精彩呈现
  5. 数据结构+算法 学习计划与资源
  6. python从零开始基础入门——开发环境搭建
  7. 云小课|DSC帮您管数据,保障您的云上数据安全
  8. php在u盘里运行,在U盘中直接运行Linux的详细步骤
  9. Objective-C中常量重复定义的解决方案
  10. 汇添富基金总经理张晖:做选股专家,更以“选股专家”的视角管理公司
  11. 前端实现Word在线预览
  12. 法曲率、主曲率、平均曲率和高斯曲率
  13. 《Jenkins持续集成入门到精通02》
  14. 如何下载 Chrome 应用商店的 .crx 文件
  15. 知网文献免费下载方法
  16. windows安装cx_oracle的坑
  17. 射频信号源及射频信号测试接口案例-纳米软件
  18. 计算机组装与维修王利民版,计算机组装与维修(第5版)
  19. ez4w.com的5折优惠码
  20. 一个简单的100以内的猜字游戏

热门文章

  1. springboot学习笔记-3 整合redismongodb
  2. vimnbsp;自动识别UTF8和GB2312
  3. 关于div布局中float的使用
  4. [转载] Python字符串:大写 str.upper()
  5. Django之模型层
  6. Linux文件上传下载sz 和 rz 命令
  7. 后缀自动机(学习笔记)
  8. Confluence自启动脚本
  9. Spring Web框架与Struts的区别
  10. (十一)OpenCV实现图像频率域滤波