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:王大大

总结

  1. 将String或者Bean转换为JSON,使用 fromObject(Object object) 方法
  2. 将Json转换为String,使用 toString() 方法
  3. 将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 的差别

感谢大佬:https://www.e-learn.cn/content/qita/1975198

一、创建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)

posted @ 2019-08-21 11:25  超级小白龙  阅读(249)  评论(0)    收藏  举报