Json与Gson
感谢大佬:https://blog.csdn.net/linkingfei/article/details/83045815
一、json简介:
数据结构:
Object、Array
基本类型:
string、number、true、false、null、
二、json数据解析
1、创建maven项目、引入依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2、json数据格式、包括基本数据类型:
{
"name":"link",
"age":23,
"birthday":"1995-8-21",
"school":"xian",
"major":["计算机","化工"],
"has_girlfriend":false,
"car":null
}
3、转换为json格式的几种方法:
- 直接存储数据到JSONObject对象:
private static void JSONObject() throws JSONException{
JSONObject w=new JSONObject();
Object nullobj=null;
w.put("name", "link");
w.put("age", 23);
w.put("birthday", "1995-8-21");
w.put("school", "xian");
w.put("major", new String[]{"计算机","化工"});
w.put("has_girlfriend", false);
w.put("car", nullobj);
System.out.println(w.toString());
}
- 将Map型数据通过JSONObject转换:
private static void createJsonByMap(){
Map<String,Object> w=new HashMap<String,Object>();
w.put("name", "link");
w.put("age", 23);
w.put("birthday", "1995-8-21");
w.put("school", "xian");
w.put("major", new String[]{"计算机","化工"});
w.put("has_girlfriend", false);
w.put("car", null);
System.out.println(new JSONObject(w));
}
- 将Bean类型的通过JSONObject转换:
创建Bean:
public class ObjectBean {
private String name;
private String school;
private boolean has_girlfriend;
private int age;
private Object car;
private String[] major;
private String birthday;
}
private static void createJsonByBean(){
ObjectBean w=new ObjectBean();
w.setAge(23);
w.setBirthday("1995-8-21");
w.setCar(null);
w.setHas_girlfriend(false);
w.setMajor(new String[]{"计算机","化工"});
w.setName("link");
w.setSchool("xian");
System.out.println(new JSONObject(w));
}
- 从文件中读取数据通过JSONObject转换:
文件w.json:
{
"name":"link",
"age":23,
"birthday":"1995-8-21",
"school":"xian",
"major":["计算机","化工"],
"has_girlfriend":false,
"car":null
}
private static void createJsonByReadfile() throws IOException{
File file=
new File(JsonObjectSimple.class.getResource("/w.json").getFile());
String content=FileUtils.readFileToString(file);
JSONObject jsonObject=new JSONObject(content);
if(!jsonObject.isNull("name")){
System.out.println("name:"+jsonObject.getString("name"));
}
JSONArray majar=jsonObject.getJSONArray("major");
System.out.println(majar);
}
三、gson数据解析:
1、引入依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>
2、gson转换:
- 将Bean类型的通过Gson转换:
public void gsonObjectByBean(){
ObjectBean w=new ObjectBean();
w.setAge(23);
w.setBirthday("1995-8-21");
w.setCar(null);
w.setHas_girlfriend(false);
w.setMajor(new String[]{"计算机","化工"});
w.setName("link");
w.setSchool("xian");
w.setIgnore("minmin");
/**
* //重命名方式1:
* @SerializedName("NAME")
* private String name;
*
* 方式2如下:
*/
GsonBuilder gsonBuilder=new GsonBuilder();
gsonBuilder.setPrettyPrinting();
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field f) {
if(f.getName().equals("name")){
return "NAME";
}
return f.getName();
}
});
Gson gson1=gsonBuilder.create();
System.out.println(gson1.toJson(w));
//通过Gson直接转换
Gson gson=new Gson();
System.out.println(gson.toJson(w));
}
- 读取json文件的通过Gson转换为Bean:
public void gsonToBeanByReadJson() throws IOException{
File file=
new File(GsonCreateSimple.class.getResource("/w.json").getFile());
String content=FileUtils.readFileToString(file);
Gson gson=new Gson();
//json文件转为bean
ObjectBean w=gson.fromJson(content, ObjectBean.class);
//重写toString()
System.out.println(w);
}
- 读取json文件的通过Gson转换为Bean(带有Date类型的Bean):
修改Bean:private Date birthday;
public void gsonReadDate() throws IOException{
File file=
new File(GsonCreateSimple.class.getResource("/w.json").getFile());
String content=FileUtils.readFileToString(file);
Gson gson=
new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
ObjectBean1 w=gson.fromJson(content, ObjectBean1.class);
System.out.println(w.getBirthday().toLocaleString());
}
- 自动解析带有集合类型的Bean:
private List major;
private Set major;
File file=
new File(GsonCreateSimple.class.getResource("/w.json").getFile());
String content=FileUtils.readFileToString(file);
ObjectBean1 w=gson.fromJson(content, ObjectBean1.class);
//集合类型List、Set
System.out.println(w.getMajor());
补充:
https://www.cnblogs.com/qinxu/p/9504412.html
https://www.jianshu.com/p/1409eec214d0
json是一种数据格式,便于数据传输、存储、交换
gson是一种组件库,可以把java对象数据转换成json数据格式(转换)
https://blog.csdn.net/qq_34394010/article/details/78180289
补充:使用JSONObject将实体类,String类型和JSON类型相互转换(java)
感谢大佬:https://blog.csdn.net/weixin_42424720/article/details/84642999
People.java
public class People {
private int id;
private String name;
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
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;
}
}
MainTest.java
import net.sf.json.JSONObject;
public class MainTest {
public static void main(String[] args) {
//创建JSONOobject类
JSONObject json;
//创建测试Bean
People people = new People();
people.setId(12);
people.setName("王大大");
//1.将Bean转换为Json格式
json = JSONObject.fromObject(people);
//2.将Json格式转换为String类型
String jsonStr = json.toString();
System.out.println("Bean转换为Json:" + jsonStr);
//3.将String转换为Json格式,Json格式通过toString()方法转换为String类型
json = JSONObject.fromObject(jsonStr);
System.out.println("String转换为Json:" + json.toString());
//4.将Json格式转换为Bean
People peo = (People) json.toBean(json, People.class);
System.out.println("Json转换为Bean:" + peo.toString());
//5.测试Json转换后的Bean
System.out.println("测试Json转换后的Bean:" + peo.getName());
}
}
运行结果
Bean转换为Json:{"id":12,"name":"王大大"}
String转换为Json:{"id":12,"name":"王大大"}
Json转换为Bean:People [id=12, name=王大大]
测试Json转换后的Bean:王大大
总结
- 将String或者Bean转换为JSON,使用 fromObject(Object object) 方法
- 将Json转换为String,使用 toString() 方法
- 将Json转换为Bean,使用toBean(JSONObject jsonObject, Class beanClass)
JSONObject API
参考网站:http://json-lib.sourceforge.net/apidocs/jdk15/index.html
补充:
上述两篇博文所用的不同JSONObject对象的区别
net.sf.json.JSONObject 和org.json.JSONObject 的差别
一、创建json对象
String str = "{\"code\":\"0000\", \"msg\":{\"availableBalance\":31503079.02}}
org.json.JSONObject: JSONObject json = new JSONObject(str);
net.sf.json.JSONObject: JSONObject json = JSONObject.fromObject(str);
//net.sf.json.jsonobject 没有 new JSONObject(String)的构造方法
二、解析json
第一种直接用json对象 .getXXX();方法获取
org.json.JSONObject: //获取的字段类型必须跟getXXX()的类型一样
net.sf.json.JSONObject: //没有严格要求获取字段的类型跟getXXX()的类型一样
例如:
JSONObject msgObj = json.getJSONObject("msg");
String availableBalance = msgObj.getString("availableBalance");
如果在org.json.JSONObject 就会报错,可以msgObj.getDouble("availableBalance");也不会丢精度;
而net.sf.json.JSONObject正确,但是精度会丢失,
如果String str = "{\"code\":\"0000\", \"msg\":{\"availableBalance\":\"31503079.02\"}}";就不会丢失精度。
第二种json对象直接转变实体对象
public class BalanceDto {
private String availableBalance;
public String getAvailableBalance() {
return availableBalance;
}
public void setAvailableBalance(String availableBalance) {
this.availableBalance = availableBalance;
}
public String toString(){
return "availableBalance "+availableBalance;
}
}
org.json.JSONObject: BalanceDto alanceDto = (BalanceDto) JSONObject.stringToValue(msgObj);
这个句话编译通过,但是运行会报错,原因是BalanceDto 类中availableBalance 的类型跟json中的“availableBalance ”类型不一致
net.sf.json.JSONObject: String msg = json.getString("msg");
BalanceDto alanceDto = (BalanceDto) JSONObject.toBean(msg, new BalanceDto().getClass());
三、从json中获取数组
JSONArray subArray = json.getJSONArray("msg");
net.sf.json.JSONObject: int leng = subArray.size();
org.json.JSONObject: int leng = subArray.length();
补充:
企业中常用的Json处理
使用JSONObject将实体类,Json字符串和Json类型相互转换(java)
感谢大佬:https://blog.csdn.net/weixin_42424720/article/details/102628254
使用的是com.alibaba.fastjson.JSONObject
JSONObject的maven依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
People.java
package com.dddd.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.util.Date;
/**
* @ClassName People
* @Description
* @Date 2019/10/18
* @Version 1.0
*/
public class People implements Serializable{
private static final long serialVersionUID = -874758492035405289L;
/**
* @Description id
* @Date 2019/10/18 15:46
* @Param
* @return
**/
private int id;
/**
* @Description 姓名
* @Date 2019/10/18 15:46
* @Param
* @return
**/
private String name;
/**
* @Description 性别
* @Date 2019/10/18 15:46
* @Param
* @return
**/
private String sex;
/**
* @Description 年龄
* @Date 2019/10/18 15:46
* @Param
* @return
**/
private int age;
/**
* @Description 出生时间
* @Date 2019/10/18 15:46
* @Param
* @return
**/
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex == null ? null : sex.trim();
}
@Override
public String toString() {
return "People{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
JSONObjectTest.java测试类
package com.dddd;
import com.alibaba.fastjson.JSONObject;
import com.dddd.entity.People;
import java.util.Date;
/**
* @ClassName JSONObjectTest
* @Description
* @Date 2019/10/18
*/
public class JSONObjectTest {
public static void main(String[] args) {
//创建JSON对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 1);
jsonObject.put("age", 1);
jsonObject.put("name", "明明");
jsonObject.put("sex", "男");
jsonObject.put("birthday", new Date());
//将JSON格式转换为Object
People jsonToObject = JSONObject.toJavaObject(jsonObject, People.class);
System.out.println("将JSON转换为Object:");
System.out.println(jsonToObject.toString() + "\n");
//将Object转换为JSON字符串
String objectToStr = JSONObject.toJSONString(jsonToObject);
System.out.println("将Object转换为JSON字符串:");
System.out.println(objectToStr + "\n");
//将JSON字符串转换为JSON格式
JSONObject strToJson = JSONObject.parseObject(objectToStr);
//通过JSONObject获取属性
int id = (int)strToJson.get("id");
int age = (int)strToJson.get("age");
String name = (String)strToJson.get("name");
String sex = (String)strToJson.get("sex");
Date birthday = new Date((long) strToJson.get("birthday"));
System.out.println("字符串转换为JSON格式:");
System.out.println("通过JSON对象获取到的属性:id:" + id + ",age:" + age + ",name:" + name + ",sex:" + sex + "," + birthday);
}
}
控制台打印如下:
将JSON转换为Object:
People{id=1, name='明明', sex='男', age=1, birthday=Fri Oct 18 16:48:30 CST 2019}
将Object转换为JSON字符串:
{"age":1,"birthday":1571388510371,"id":1,"name":"明明","sex":"男"}
字符串转换为JSON格式:
通过JSON对象获取到的属性:id:1,age:1,name:明明,sex:男,Fri Oct 18 16:48:30 CST 2019
总结
1. 将Object实体类转换为Json字符串,使用 JSONObject.toJSONString(Object obj)
2. 将Json字符串转换为Json格式,使用JSONObject.parseObject(String str)
3. 将Json格式转换为Object实体类,使用JSONObject.toJavaObject(JSONObject jsonObject,
Object.class)

浙公网安备 33010602011771号