JSON快速入门(Java版)

1.JSON

         JSON简介: 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

        JSON:是行业内使用最为广泛的数据传输格式。

        (调用服务端)API时会使用JSON作为返回格式。

        JSON是数据存储的一种格式,格式简单,易于读写,格式都是压缩的,占用带宽小。

        最初来自JS,后来几乎每种常用语言都有处理JSON的API,支持多种服务器端语言,便于服务器端的解析。

        JSON缺点:要求字符集必须是Unicode,受约束性强。

        ①JSON是一种与开发语言无关的、轻量级的数据格式。全称为JavaScript Object Notation。            

                优点:易于人的阅读和编写,易于程序解析与生产。

        ②实例:

                

        { }:标识一个对象(即结构体)

                { }中包含键值对结构,key必须是String类型,value为任何基本类型或数据结构。

                

        [ ]:代表数组Array,并用逗号,来分隔元素

                

        基本类型:String、number、true、false、null。

                ps:(没有浮点整数、正负数...之分,在写java代码时,JSONObject的put方法会自动区分不同数字格式。)

                        这是一种JSONObject原生数据格式到java数据格式的映射关系。

                元素可以是任意类型。

                标准JSON不支持任何形式注释。

                json没有日期数据格式。

        ③org.json包的使用:

            a.生成JSON对象

package json;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
/**
* @Auther: wjy
* @Date: 2018/10/10 16:34
* @Description: 使用JSONObject相关构建JSON对象。
*/
public class jsonTest {

    public static void main(String[] args) {
        jsonobject();// 使用JSONObject构建JSON对象。
        createJsonByMap();// 通过HashMap数据结构构建JSON对象。
        createjavaBean();// 通过Javabean来构建JSON对象。
    }

    private static void jsonobject() {
        JSONObject messi = new JSONObject();// 构建JSON对象。
        Object NULL = null;
        try {
            messi.put("name","messi");
            messi.put("name","梅西");// 替代性,二次赋值会代替第一次赋值。
            messi.put("age",31.4);
            messi.put("birthday","1987-06-24");
            messi.put("school","Barcelona");
            messi.put("major",new String[]{"player","star"});// 也可以使用集合装数组。
            messi.put("car",true);
            messi.put("house",true);
            messi.put("daughter",NULL);// 直接复制null会产生二义性。
            messi.put("girlfriend","安东内拉");
            messi.put("comment","love him!!");
            System.out.println(messi/*或messi.toString()*/);// 不会按照插入数据顺序显示。
        /*{"birthday":"1987-06-24","girlfriend":"安东内拉","major":["player","star"],"school":"Barcelona","car":true,"name":"梅西","comment":"love him!!","house":true,"age":31.4}*/
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private static void createJsonByMap() {
        HashMap<String,Object> messi = new HashMap<String, Object>();
        Object NULL = null;
        messi.put("name","messi");
        messi.put("name","梅西");
        messi.put("age",31.4);
        messi.put("birthday","1987-06-24");
        messi.put("school","Barcelona");
        messi.put("major",new String[]{"player","star"});
        messi.put("car",true);
        messi.put("house",true);
        messi.put("daughter",NULL);
        messi.put("girlfriend","安东内拉");
        messi.put("comment","love him!!");
        System.out.println(new JSONObject(messi)/*或new JSONObject(messi).toString()*/);
        /*{"birthday":"1987-06-24","girlfriend":"安东内拉","major":["player","star"],"school":"Barcelona","car":true,"name":"梅西","comment":"love him!!","house":true,"daughter":null,"age":31.4}*/
        // 构造函数支持传入Map接口对象 将Map转换为JSON。
    }

    private static void createjavaBean() {
        beanTest messi = new beanTest();
        Object NULL = null;
        messi.setName("messi");
        messi.setName("梅西");
        messi.setAge(31.4);
        messi.setBirthday("1987-06-24");
        messi.setSchool("Barcelona");
        messi.setMajor(new String[]{"player","star"});
        messi.setCar(true);
        messi.setHouse(true);
        messi.setDaughter(NULL);
        messi.setGirlfriend("安东内拉");
        messi.setComment("love him!!");
        System.out.println(new JSONObject(messi/*messi.toString()*/));// 最终的方式还是使用JSONObject。
        // 但是并没有把属性置于JSONObject中。
        /*{"birthday":"1987-06-24","girlfriend":"安东内拉","major":["player","star"],"school":"Barcelona","car":true,"name":"梅西","comment":"love him!!","daughter":null,"house":true,"age":31.4}*/
    }
}

package json;
/**
* @Auther: wjy
* @Date: 2018/10/10 17:21
* @Description: JavaBean。
*/
public class beanTest {

        private String name;
        private double age;
        private String birthday;
        private String school;
        private String[] major;
        private Boolean car;
        private Boolean house;
        private String girlfriend;
        private Object daugter;
        private String comment;

        public beanTest(){}

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        ...
        public String getComment() {
            return comment;
        }
        public void setComment(String comment) {
            this.comment = comment;
        }
}

            b.解析json数据格式通过文件读取/远程API获取数据内容,再转换为JSONObject。

package json;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @Auther: wjy
* @Date: 2018/10/10 18:31
* @Description: 解析json数据格式。
*      JSONObject不支持使用JavaBean反解析json。
*/
public class readJsonTest {

    public static void main(String[] args) throws IOException, JSONException {
        File file = new File(readJsonTest.class.getResource("../messi.json").getFile());// class的方法获取文件。
        // 快速读取内容。
        String content = FileUtils.readFileToString(file);// 读取文件内容。
        JSONObject json = new JSONObject(content);// 将读取内容转换为json对象。
        // bug:
        // JSONArray majorArray  = new JSONArray("major");// 需要JSONArray解析json数组。
        if( !json.isNull("name")) {// 通过此方法,增加程序健壮性。
            System.out.println("姓名: " + json.getString("name"));
        }
        System.out.println("年龄: "+json.getDouble("age"));
        System.out.println("生日: "+json.getString("birthday"));
        System.out.println("学校: "+json.getString("school"));
        // bug:
                /*for(int i=0; i<majorArray.length(); i++) {
            String m = majorArray.getString(i);
            System.out.println("专业"+(1+i)+m);
        }*/
        System.out.println("有车车吗: "+json.getBoolean("car"));
        System.out.println("有房房吗: "+json.getBoolean("house"));
        System.out.println("有女朋友吗: "+json.getString("girlfriend"));
        System.out.println("有女儿吗: "+json.getString("daughter"));
        System.out.println("注释: "+json.getString("comment"));
        /*
        姓名: 梅西
        年龄: 31.4
        生日: 1987-06-24
        学校: Barcelona
        有车车吗: true
        有房房吗: true
        有女朋友吗: 安东内拉
        有女儿吗: null
        注释: love him!
        */
    }
}

2.GSON

        谷歌提出的,开源的第三方工具。

        相比于JSONObject,功能更加强大,性能更加出色,使用方式更加简单和便捷。  

        ①GSON生成JSON数据

            为了改变某一确定的配置,可以使用GsonBuilder创建Gson实例,并自定义各种配置。

            GsonBuilder类提供了.Create()方法,该方法返回一个Gson实例。

            该Gson实例可以做任何之前已经向你展示的功能:映射任何从JSON来或者到JSON去的数据。   

       Gson gson = new Gson();
       GsonBuilder gsonBuilder = new GsonBuilder();  
       Gson gson = gsonBuilder.create();  
package gson;
import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.lang.reflect.Field;
/**
* @Auther: wjy
* @Date: 2018/10/11 10:13
* @Description: 生成Json数据。
*/
public class createJavaBean {

    public static void main(String[] args) {
        beanTest1 messi = new beanTest1();
        Object NULL = null;
        messi.setName("messi");
        messi.setName("梅西");
        messi.setAge(31.4);
        messi.setBirthday("1987-06-24");
        messi.setSchool("Barcelona");
        messi.setMajor(new String[]{"player", "star"});
        messi.setCar(true);
        messi.setHouse(true);
        messi.setDaughter(NULL);
        messi.setGirlfriend("安东内拉");
        messi.setComment("love him!!");

        // 通过注解将name变为NAME。
        // 即在构建过程中个性化。
        Gson g1 = new Gson();
        System.out.println(g1.toJson(messi));// 生成JSON数据。
        /*{"NAME":"梅西","age":31.4,...}*/

        // 通过传入回调参数将age变为AGE。
        GsonBuilder g2 = new GsonBuilder();
        g2.setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field field) {
                if (field.getName().equals("age")) {// key为age时,变为AGE。
                    return "AGE";
                }
                return field.getName();// 否则正常返回。
            }
        });
        g1 = g2.create();
        System.out.println(g1.toJson(messi));// 生成Json数据。
        /*{"NAME":"梅西","AGE":31.4,...}*/        

        // 美化json格式,返回美丽的格式。
        g2.setPrettyPrinting();// 美化格式。
        g1 = g2.create();
        System.out.println(g1.toJson(messi));// 生成Json数据。
        /*{
          "NAME": "梅西",
          "AGE": 31.4,
          "birthday": "1987-06-24",
          "school": "Barcelona",
          "major": [
          "player",
          "star"
          ],
          "car": true,
          "house": true,
          "girlfriend": "安东内拉",
          "comment": "love him!!"
        }
        */

        // 要在JavaBean中构建json时隐藏某个属性。
        // 即运行时看不到这个属性,private transient String ignore。
        messi.setIgnore("I love you!");
        System.out.println(g1.toJson(messi));// 生成Json数据。
    }
}

package gson;
import com.google.gson.annotations.SerializedName;

public class beanTest1 {

        @SerializedName("NAME")
        // 通过添加注解的方式,标识生成json格式数据的一个key。
        // 将name转换为NAME,相当于解析的时候重新命名。
        // GSON有更强的灵活性。
        private String name;

        private double age;
        private String birthday;
        private String school;
        private String[] major;
        private Boolean car;
        private Boolean house;
        private String girlfriend;
        private Object daughter;
        private String comment;

        public beanTest1(){}

        private  transient String ignore;
       // 用这种定义方式隐藏属性。

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        ...
        public String getIgnore() {
            return ignore;
        }
        public void setIgnore(String ignore) {
            this.ignore = ignore;
        }
}

        ②GSON解析JSON数据格式:  

package gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
/**
* @Auther: wjy
* @Date: 2018/10/11 20:00
* @Description: Gson解析。
*/
public class readGsonTest {

    public static void main(String[] args) throws IOException { 
          File file = new File(readGsonTest.class.getResource("../messi.json").getFile());
            // class的方法获取文件。
            // 快速读取内容。
            String content = FileUtils.readFileToString(file);// 读取文件内容。

            // Gson解析(带日期转换)
            // json是不支持日期格式的,但java支持,所以在java中解析json时,
            // 使用GsonBuilder的setDateFormat("yyyy-MM-dd")方法可以转换成Date格式。
            Gson g1 = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
            // 即把符合这个模板格式的日期字符串(json中birthday的value)转换成Date类型(Javabean中birthday值)。
            beanTest2 messi = g1.fromJson(content, beanTest2.class);
            System.out.println(messi.getBirthday());
            // Wed Jun 24 00:00:00 CDT 1987。

            messi = g1.fromJson(content, beanTest2.class);
            // Json反向解析成Javabean对象。
            System.out.println(messi.toString());// gson.beanTest1@........。
            System.out.println(messi);// gson.beanTest1@........。
            System.out.println(messi.getGirlfriend());// 安东内拉。
            System.out.println(messi.getAge());// 31.4。

            // 将json数组与Java中集合类无缝对接。
            // 即将json中的数组自动转换为Javabean中的集合类型。
            // 实际开发中,常用集合类代替数据,集合有更多特性,可满足不同应用。
            System.out.println(messi.getMajor());// [player, star]。
            System.out.println(messi.getMajor().getClass());// class java.util.ArrayList。
    }
}

package gson;
import java.util.Date;
import java.util.List;

public class beanTest2 {

        private double age;
        private Date birthday;
        private List<String> major;
        private String girlfriend;

        public beanTest2(){}

        public double getAge() {
            return age;
        }
        public void setAge(double age) {
            this.age = age;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public List<String> getMajor() {
            return major;
        }
        public void setMajor(List<String> major) {
            this.major = major;
        }
        public String getGirlfriend() {
            return girlfriend;
        }
        public void setGirlfriend(String girlfriend) {
            this.girlfriend = girlfriend;
        }
}

3.其他

        JSON是Android SDK官方的库。

        GSON应用于服务端开发,功能更强大。


4.阿里

        未完待续。

猜你喜欢

转载自blog.csdn.net/qq_41979043/article/details/83020101