zoukankan      html  css  js  c++  java
  • android学习笔记----json和gson

    目录

    JSON:

    什么是JSON:

    JSON的使用:

    用JSONObject生成JSON对象:

    使用Map构建JSON对象:

    使用Java Bean构建JSON对象:

    json解析:

    Gson:

    Gson生成json数据:

    Gson解析:

    Gson优点:


    json是行业内使用最为广泛的数据传输格式。json比xml最大的优势就是省流量。

    大多数服务端都是用json传输数据的

    JSON:

            什么是JSON:

    这里就没有浮点数、正数、负数的区分,就是number,写一个数字就行。

    多个键值对之间用逗号分隔。 

    在json里面是没有日期,时间这类的数据格式的。可以用字符串来描述一个日期,也可以用数字时间戳来描述一个日期,解析的时候注意处理就好。

    JSON的使用:

    一个json的例子:

    json官网:http://json.org/json-zh.html

    先创建一个maven的project,怎么创建可以看这里:https://blog.csdn.net/qq_38719039/article/details/79803338

    Java中JSON包的参考实现:http://stleary.github.io/JSON-java/index.html

    在pom.xml中添加依赖,会自动下载jar包

    <dependency>

        <groupId>org.json</groupId>

        <artifactId>json</artifactId>

        <version>20180130</version>

    </dependency>

    然后在src/main/java里面创建一个java文件JsonObjectSample

    用JSONObject生成json对象:

    JsonObjectSample.java

    package com.json.Json;
    
    import org.json.JSONObject;
    
    public class JsonObjectSample {
    
        public static void main(String[] args) {
            jSONObject();
        }
    
        private static void jSONObject() {
            // TODO Auto-generated method stub
            JSONObject wangxiaoer = new JSONObject();
            Object nullObj = null;
            try {
                wangxiaoer.put("name", "王小二");
                wangxiaoer.put("age", 25.2);
                wangxiaoer.put("birthday", "1990-01-01");
                wangxiaoer.put("school", "蓝翔");
                wangxiaoer.put("major", new String[] { "理发", "挖掘机" });
                wangxiaoer.put("has_girlfriend", false);
                wangxiaoer.put("car", nullObj);
                wangxiaoer.put("house", nullObj);
                wangxiaoer.put("comment", "这是一个注释");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {            
                System.out.println(wangxiaoer.toString());
            }
        }
    }
    

    运行结果:

    {"birthday":"1990-01-01","major":["理发","挖掘机"],"name":"王小二","has_girlfriend":false,"school":"蓝翔","comment":"这是一个注释","age":25.2}

    这不方便查看!!

    如下  ↓

    json格式化查看数据:https://jsoneditoronline.org/

    其他能格式化json数据的网址如下:

    使用Map构建JSON对象:

    JsonObjectSample.java

    package com.json.Json;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.json.JSONObject;
    
    public class JsonObjectSample {
    
        public static void main(String[] args) {
            createJsonByMap();
        }
    
        private static void createJsonByMap() {
            Map<String, Object> wangxiaoer = new HashMap<String, Object>();
            Object nullObj = null;
            try {
                wangxiaoer.put("name", "王小二");
                wangxiaoer.put("age", 25.2);
                wangxiaoer.put("birthday", "1990-01-01");
                wangxiaoer.put("school", "蓝翔");
                wangxiaoer.put("major", new String[] { "理发", "挖掘机" });
                wangxiaoer.put("has_girlfriend", false);
                wangxiaoer.put("car", nullObj);
                wangxiaoer.put("house", nullObj);
                wangxiaoer.put("comment", "这是一个注释");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // JSONObject构造方法支持传入一个Map对象
                System.out.println(new JSONObject(wangxiaoer));
            }
        }
    }

    运行结果:

    {"birthday":"1990-01-01","major":["理发","挖掘机"],"name":"王小二","has_girlfriend":false,"school":"蓝翔","comment":"这是一个注释","age":25.2}
     

    和上面预期的一样。

    使用Java Bean构建JSON对象:

    Diaosi.java

    package javabean;
    
    import java.util.Arrays;
    
    public class Diaosi {
        private String name;
        private String school;
        private boolean has_girlfriend;
        private double age;
        private Object car;
        private Object house;
    
        @Override
        public String toString() {
            return "Diaosi [name=" + name + ", school=" + school + ", has_girlfriend=" + has_girlfriend + ", age=" + age
                    + ", car=" + car + ", house=" + house + ", major=" + Arrays.toString(major) + ", comment=" + comment
                    + ", birthday=" + birthday + "]";
        }
    
        private String[] major;
        private String comment;
        private String birthday;
    
        public Diaosi() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSchool() {
            return school;
        }
    
        public void setSchool(String school) {
            this.school = school;
        }
    
        public boolean isHas_girlfriend() {
            return has_girlfriend;
        }
    
        public void setHas_girlfriend(boolean has_girlfriend) {
            this.has_girlfriend = has_girlfriend;
        }
    
        public double getAge() {
            return age;
        }
    
        public void setAge(double age) {
            this.age = age;
        }
    
        public Object getCar() {
            return car;
        }
    
        public void setCar(Object car) {
            this.car = car;
        }
    
        public Object getHouse() {
            return house;
        }
    
        public void setHouse(Object house) {
            this.house = house;
        }
    
        public String[] getMajor() {
            return major;
        }
    
        public void setMajor(String[] major) {
            this.major = major;
        }
    
        public String getComment() {
            return comment;
        }
    
        public void setComment(String comment) {
            this.comment = comment;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    }
    

     JsonObjectSample.java

    package com.json.Json;
    
    import org.json.JSONObject;
    
    import javabean.Diaosi;
    
    public class JsonObjectSample {
    
        public static void main(String[] args) {
            createJsonByBean();
        }
    
        private static void createJsonByBean() {
            Diaosi wangxiaoer = new Diaosi();
            wangxiaoer.setName("王小二");
            wangxiaoer.setAge(25.2);
            wangxiaoer.setBirthday("1990-01-01");
            wangxiaoer.setSchool("蓝翔");
            wangxiaoer.setMajor(new String[] { "理发", "挖掘机" });
            wangxiaoer.setHas_girlfriend(false);
            wangxiaoer.setCar(null);
            wangxiaoer.setHouse(null);
            wangxiaoer.setComment("这是一个注释");
            System.out.println(new JSONObject(wangxiaoer));
        }
    }
    

    运行结果:

    {"birthday":"1990-01-01","major":["理发","挖掘机"],"school":"蓝翔","name":"王小二","has_girlfriend":false,"comment":"这是一个注释","age":25.2}
     

    和上面一样。推荐使用java bean来构建json对象

    json解析:

    可能从远程或者网络获取到一个json的数据格式的文件, 现在需要将其解析出来。

    添加依赖:

            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>

    ReadJSONSample.java

    package com.json.Json;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    import org.json.JSONArray;
    import org.json.JSONObject;
    
    public class ReadJSONSample {
        public static void main(String[] args) throws IOException {
            File file = new File(ReadJSONSample.class.getResource("/wangxiaoer.json").getFile());
            // 查看json属性,默认是utf-8编码
            String content = FileUtils.readFileToString(file, "utf-8"); // 一个参数的方法过时,建议指定编码表
            JSONObject jsonObject = new JSONObject(content);
            // 如果键不存在,或者值为空则不会打印
            if (!jsonObject.isNull("name")) {       
                System.out.println("姓名:" + jsonObject.getString("name"));
            }
            if (!jsonObject.isNull("age")) {            
                System.out.println("年龄:" + jsonObject.getDouble("age")); // 将number解析成java基本类型
            }
            if (!jsonObject.isNull("birthday")) {
                System.out.println("出生日期:" + jsonObject.getString("birthday"));
            }
            if (!jsonObject.isNull("has_girlfriend")) {            
                System.out.println("是否有女朋友:" + jsonObject.getBoolean("has_girlfriend"));
            }
            if (!jsonObject.isNull("school")) {
                System.out.println("学校:" + jsonObject.getString("school"));
            }
            if (!jsonObject.isNull("major")) {            
                JSONArray majorArray = jsonObject.getJSONArray("major");
                int len = majorArray.length(); // 不能用foreach,JSONArray不是java里的数组或集合类型
                for (int i = 0; i < len; ++i) {
                    System.out.println("专业-" + (i + 1) + ":" + majorArray.get(i));
                }
            }
            if (!jsonObject.isNull("comment")) {
                System.out.println("注释:" + jsonObject.getString("comment"));
            }
        }
    }

    这个第三方库不支持将json数据转换成java bean,所以我们手动操作。

    运行结果:

    批注:

    关于Class.getResource(String path),

    path 不以’/'开头时,默认是从此类所在的包下取资源

    path 以’/'开头时,则是从ClassPath根下获取,就是从class文件的根目录下获取

    可以用两句话打印一下:

    package PTA;
    
    public class Test {
        public static void main(String[] args) {
            System.out.println(Test.class.getResource(""));
            System.out.println(Test.class.getResource("/"));
        }
    }
    

    打印结果:

    file:/D:/eclipse_workspace/practice/bin/PTA/
    file:/D:/eclipse_workspace/practice/bin/

    上面说到的【path以’/'开头时,则是从ClassPath根下获取;】在这里就是相当于bin目录(Eclipse环境下)。

    关于URL的getFile()和getPath()方法区别:

    见这里https://blog.csdn.net/l375852247/article/details/7999063

    Gson:

        Gson生成json数据:

    添加依赖:

            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.5</version>
            </dependency>

    GsonCreateSample.java

    package gson;
    
    import com.google.gson.Gson;
    
    import javabean.Diaosi;
    
    public class GsonCreateSample {
        public static void main(String[] args) {
            Diaosi wangxiaoer = new Diaosi();
            wangxiaoer.setName("王小二");
            wangxiaoer.setAge(25.2);
            wangxiaoer.setBirthday("1990-01-01");
            wangxiaoer.setSchool("蓝翔");
            wangxiaoer.setMajor(new String[] { "理发", "挖掘机" });
            wangxiaoer.setHas_girlfriend(false);
            wangxiaoer.setCar(null);
            wangxiaoer.setHouse(null);
            wangxiaoer.setComment("这是一个注释");
    
            Gson gson = new Gson();
            System.out.println(gson.toJson(wangxiaoer)); // 传java bean
        }
    }

    {"name":"王小二","school":"蓝翔","has_girlfriend":false,"age":25.2,"major":["理发","挖掘机"],"comment":"这是一个注释","birthday":"1990-01-01"}


    在java bean的name字段上添加@SerializedName("NAME"),这是Gson中的属性,如图:

    则运行结果如下,name变成了大写。

    {"NAME":"王小二","school":"蓝翔","has_girlfriend":false,"age":25.2,"major":["理发","挖掘机"],"comment":"这是一个注释","birthday":"1990-01-01"}

    可见,Gson更加强大。
     

    相同功能更好的实现如下:

    package gson;
    
    import java.lang.reflect.Field;
    
    import com.google.gson.FieldNamingStrategy;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    import javabean.Diaosi;
    
    public class GsonCreateSample {
        public static void main(String[] args) {
            Diaosi wangxiaoer = new Diaosi();
            wangxiaoer.setName("王小二");
            wangxiaoer.setAge(25.2);
            wangxiaoer.setBirthday("1990-01-01");
            wangxiaoer.setSchool("蓝翔");
            wangxiaoer.setMajor(new String[] { "理发", "挖掘机" });
            wangxiaoer.setHas_girlfriend(false);
            wangxiaoer.setCar(null);
            wangxiaoer.setHouse(null);
            wangxiaoer.setComment("这是一个注释");
    
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.setPrettyPrinting();
            gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
    
                public String translateName(Field f) {
                    // 和在javabean文件中加@SerializedName效果一样,生成json数据时可以更改key值
                    if (f.getName().equals("name")) {
                        return "NAME";
                    }
                    return f.getName();
                }
            });
            // 用gsonBuilder.create()比new Gson生成的json数据格式更好看,相当于格式化json数据了
            // gson比json更灵活
            Gson gson = gsonBuilder.create();
            System.out.println(gson.toJson(wangxiaoer)); // 传java bean
        }
    }

    运行结果:

    可见,"name"被改为了"NAME"

    如果需要某一属性在生成json的时候不被包含进去,那么我们可以使用transient修饰那个字段。

    比如:

    那么刚刚的运行结果就变化了:

    Gson解析:

    GsonReadSample.java

    package gson;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    
    import com.google.gson.Gson;
    import com.json.Json.ReadJSONSample;
    
    import javabean.Diaosi;
    
    public class GsonReadSample {
        public static void main(String[] args) throws IOException {
            File file = new File(ReadJSONSample.class.getResource("/wangxiaoer.json").getFile());
            // 查看json属性,默认是utf-8编码
            String content = FileUtils.readFileToString(file, "utf-8"); // 一个参数的方法过时,建议指定编码表
            Gson gson = new Gson();
            // json反解析
            Diaosi wangxiaoer = gson.fromJson(content, Diaosi.class);
            System.out.println(wangxiaoer);
        }
    }
    

    运行结果:

    Diaosi [name=王小二, school=蓝翔, has_girlfriend=false, age=25.2, car=null, house=null, major=[理发, 挖掘机], comment=这是一个注释, birthday=1990-01-01]
     

    就是java bean里面的toString()

    Gson优点:

    gson可以由java bean生成json数据,也可以由json数据反解析成java bean对象

    这是json做不到的,用java bean可以生成json对象,但json只能反解析成JSONObject对象,再手动输出。

    gson支持日期格式化,而json不支持

    重新建一个java bean

    DiaosiWithBirthday.java

    package javabean;
    
    import java.util.Arrays;
    import java.util.Date;
    
    public class DiaosiWithBirthday {
        private String name;
        private String school;
        private boolean has_girlfriend;
        private double age;
        private Object car;
        private Object house;
    
    
        private String[] major;
        private String comment;
        private Date birthday;
    
        public DiaosiWithBirthday() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSchool() {
            return school;
        }
    
        public void setSchool(String school) {
            this.school = school;
        }
    
        public boolean isHas_girlfriend() {
            return has_girlfriend;
        }
    
        public void setHas_girlfriend(boolean has_girlfriend) {
            this.has_girlfriend = has_girlfriend;
        }
    
        public double getAge() {
            return age;
        }
    
        public void setAge(double age) {
            this.age = age;
        }
    
        public Object getCar() {
            return car;
        }
    
        public void setCar(Object car) {
            this.car = car;
        }
    
        public Object getHouse() {
            return house;
        }
    
        public void setHouse(Object house) {
            this.house = house;
        }
    
        public String[] getMajor() {
            return major;
        }
    
        public void setMajor(String[] major) {
            this.major = major;
        }
    
        public String getComment() {
            return comment;
        }
    
        public void setComment(String comment) {
            this.comment = comment;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "DiaosiWithBirthday [name=" + name + ", school=" + school + ", has_girlfriend=" + has_girlfriend
                    + ", age=" + age + ", car=" + car + ", house=" + house + ", major=" + Arrays.toString(major)
                    + ", comment=" + comment + ", birthday=" + birthday + "]";
        }
    
    }
    

    GsonReadSample.java 

    package gson;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.json.Json.ReadJSONSample;
    
    import javabean.DiaosiWithBirthday;
    
    public class GsonReadSample {
        public static void main(String[] args) throws IOException {
            File file = new File(ReadJSONSample.class.getResource("/wangxiaoer.json").getFile());
            // 查看json属性,默认是utf-8编码
            String content = FileUtils.readFileToString(file, "utf-8"); // 一个参数的方法过时,建议指定编码表
            Gson gson = new GsonBuilder().setDateFormat("yyyy/MM/dd").create();
    
            // json反解析
            DiaosiWithBirthday wangxiaoer = gson.fromJson(content, DiaosiWithBirthday.class);
            System.out.println(gson.toJson(wangxiaoer.getBirthday()));
        }
    }
    

    运行结果:

    "1990/01/01"

    现在将DiaosiWithBirthday里面的major字段改成List<String> 类型

    package gson;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.json.Json.ReadJSONSample;
    
    import javabean.DiaosiWithBirthday;
    
    public class GsonReadSample {
        public static void main(String[] args) throws IOException {
            File file = new File(ReadJSONSample.class.getResource("/wangxiaoer.json").getFile());
            // 查看json属性,默认是utf-8编码
            String content = FileUtils.readFileToString(file, "utf-8"); // 一个参数的方法过时,建议指定编码表
            Gson gson = new GsonBuilder().setDateFormat("yyyy/MM/dd").create();
    
            // json反解析
            DiaosiWithBirthday wangxiaoer = gson.fromJson(content, DiaosiWithBirthday.class);
            System.out.println(gson.toJson(wangxiaoer.getBirthday()));
            
            
            System.out.println(wangxiaoer.getMajor());
            System.out.println(wangxiaoer.getMajor().getClass());
        }
    }

    运行结果:

     

    List<String>,gson自动用ArrayList实现

    比如再改为Set<String>

    那么就是LinkedHashSet实现,更多的大家可以自己去尝试

    gson中的集合类和java中的数组其实是一一对应的,不需要我们做额外的事情

    gson适合服务端开发,在集合的使用和定义别名上有优势

    ===============================Talk is cheap, show me the code=============================

    CSDN博客地址:https://blog.csdn.net/qq_34115899
  • 相关阅读:
    Docker
    Docker
    VIM
    Python
    Python
    VIM
    Python
    其他
    Java
    Java
  • 原文地址:https://www.cnblogs.com/lcy0515/p/10807877.html
Copyright © 2011-2022 走看看