Java 杂谈

JSON快速入门(Java版)

2019-02-20  本文已影响1人  从菜鸟到老菜鸟

一、JSON简介

1、什么是JSON

  JSON是行业使用广泛的一种数据格式。
  JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。简单地说,JSON可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是JavaScript很容易解释它,而且 JSON 可以表示比 "名称 / 值对" 更复杂的结构。
  总结什么是 JSON ?
  JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation);
  JSON 是轻量级的文本数据交换格式
  JSON 独立于语言 *
  JSON 具有自我描述性,更易理解。
  * JSON 使用 JavaScript 语法来描述数据对象(JSON 语法是 JavaScript 对象表示法语法的子集),但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
  JSON的优点:易于人的阅读和编写,方便程序解析与生成。

2、JSON语法结构

  标准的JSON数据表示
  数据结构
  Object:使用花括号 {} 包含的键值对结构,key必须是string类型,value为任何基本类型或数据结构,逗号分隔数据。
  Array:使用中括号 [] 来表示,并用逗号来分隔元素。
  基本类型:string、number、true、false、null。
简单实例(first.json)

{
    "name" : "张三",
    "age" : 25,
    "birthday" : "1994-12-12",
    "school" : "西安电子科技大学",
    "major" : ["Java", "C++"],
    "has_house" : false,
    "house" : null,
    "car" : {
        "sign" : "奔驰",
        "model" : "SUV"
    },

    "comment" : "标准JSON里面没有注释"
}

二、使用Java操作JSON

  使用Java操作JSON可以使用org.json包(Android SDK中使用的JSON官方库),在JSON的官网:http://www.json.org/ 中可以找到。使用Maven项目则添加如下依赖即可:

<dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
</dependency>

1、创建JSON对象的几种方式

import java.util.HashMap;
import java.util.Map;

import org.json.JSONObject;

import com.zxt.demo.Car;
import com.zxt.demo.Person;

public class JSONObjectTest {
    
    public static void main(String[] args) {
        jSONObject();
        creatJsonByMap();
        creatJsonByBean();
    }

    /**
     * @Description:使用JSONObject来构建JSON对象
     */
    private static void jSONObject() {
        // 创建一个JSONObject对象
        JSONObject zhangsan = new JSONObject();
        Object nullObj = null;
        
        zhangsan.put("name", "张三");
        zhangsan.put("age", 25);
        zhangsan.put("birthday", "1994-12-12");
        zhangsan.put("school", "西安电子科技大学");
        zhangsan.put("major", new String[] {"Java", "C++"});
        zhangsan.put("has_house", false);
        zhangsan.put("house", nullObj);
        JSONObject car = new JSONObject();
        car.put("sign", "奔驰");
        car.put("model", "SUV");
        zhangsan.put("car", car);
        zhangsan.put("comment", "标准JSON里面没有注释");
        
        // print
        System.out.println(zhangsan.toString());
    }
    
    /**
     * @Description:使用Map来构建JSON对象
     */
    private static void creatJsonByMap() {
        Map<String, Object> zhangsan = new HashMap<String, Object>();
        
        zhangsan.put("name", "张三");
        zhangsan.put("age", 25);
        zhangsan.put("birthday", "1994-12-12");
        zhangsan.put("school", "西安电子科技大学");
        zhangsan.put("major", new String[] {"Java", "C++"});
        zhangsan.put("has_house", false);
        zhangsan.put("house", null);
        Map<String, Object> car = new HashMap<String, Object>();
        car.put("sign", "奔驰");
        car.put("model", "SUV");
        zhangsan.put("car", car);
        zhangsan.put("comment", "标准JSON里面没有注释");
        
        // JSONObject支持使用Map对象直接构造JSON对象
        System.out.println(new JSONObject(zhangsan));
    }
    
    /**
     * @Description:使用Java Bean对象来构建JSON对象 (推荐使用的方式)
     */
    private static void creatJsonByBean() {
        Person zhangsan = new Person();
        zhangsan.setName("张三");
        zhangsan.setAge(25);
        zhangsan.setBirthday("1994-12-12");
        zhangsan.setSchool("西安电子科技大学");
        zhangsan.setMajor(new String[] {"Java", "C++"});
        zhangsan.setHas_house(false);
        zhangsan.setHouse(null);
        zhangsan.setCar(new Car("奔驰", "SUV"));
        zhangsan.setComment("标准JSON里面没有注释");
        
        // JSONObject支持使用Java Bean对象直接构造JSON对象
        System.out.println(new JSONObject(zhangsan));
    }
}

2、从json文件中读取JSON对象

1)、首先引入commons-io的依赖,以便方便读取文件

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

2)、读取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 ReadJSONTest {

    public static void main(String[] args) {
        File file = new File(ReadJSONTest.class.getResource("/zhangsan.json").getFile());
        try {
            String content = FileUtils.readFileToString(file);
            JSONObject jsonObject = new JSONObject(content);
            System.out.println(jsonObject);

            // 一般来说需要先对要获取的属性进行判空操作,防止异常发生
            if (!jsonObject.isNull("name")) {
                System.out.println("姓名是:" + jsonObject.getString("name"));
            }
            System.out.println("年龄是:" + jsonObject.getInt("age"));
            System.out.println("是否有房子:" + jsonObject.getBoolean("has_house"));
            System.out.println("汽车:" + jsonObject.getJSONObject("car"));
            JSONArray jsonArray = jsonObject.getJSONArray("major");
            for (Object str : jsonArray) {
                System.out.println("专业:" + str);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、GSON介绍

  org.json包进行JSON对象的创建与操作(JSONObject),具有两个缺点:
  1、没有日期类型;
  2、可以由Java Bean对象生成JSON对象,但是无法通过JSON对象反解析出Java Bean对象。
  这里介绍一种更强大的Java 处理JSON数据的包,gson(Gson)。

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

1、创建JSON对象

import com.google.gson.annotations.SerializedName;

public class Person {
    @SerializedName("myname")
    private String name;
    private Integer age;
    private String birthday;
    private String school;
    // 使用Gson进行解析时,这里可以直接换成Java的集合类,list、set等,Gson可以直接解析出来
    private String[] major;
    private boolean has_house;
    private String house;
    private Car car;
    private String comment;
    
    // 有些属性不需要转换为JSON的key,则声明变量时添加 transient
    private transient String ignore;
    
    // 此处省略了一系列set和get方法

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", birthday=" + birthday + ", school=" + school + ", major="
                + Arrays.toString(major) + ", has_house=" + has_house + ", house=" + house + ", car=" + car
                + ", comment=" + comment + "]";
    }
}
import java.lang.reflect.Field;

import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.zxt.demo.Car;
import com.zxt.demo.Person;

public class GsonTest {

    public static void main(String[] args) {
        Person zhangsan = new Person();
        zhangsan.setName("张三");
        zhangsan.setAge(25);
        zhangsan.setBirthday("1994-12-12");
        zhangsan.setSchool("西安电子科技大学");
        zhangsan.setMajor(new String[] {"Java", "C++"});
        zhangsan.setHas_house(false);
        zhangsan.setHouse(null);
        zhangsan.setCar(new Car("奔驰", "SUV"));
        zhangsan.setComment("标准JSON里面没有注释");
        /**
         * Java Bean中的有些属性不需要转换为JSON的key,则声明变量时添加 transient
         */
        zhangsan.setIgnore("不要看见我");
        
        /**
         * 若不做处理,则生成的JSON对象的key就是Java Bean对象的属性名
         * Gson可以通过在Java Bean对象的属性上面使用 @SerializedName("")注解, 来设置生成的JSON的key名称
         * org.json包中的JSONObject则没有这个功能,无法修改生成的JSON对象key名称
         */
        // Gson gson = new Gson();
        
        /**
         * 使用GsonBuilder来生成JSON对象,可以拥有更多操作
         */
        GsonBuilder gsonBuilder = new GsonBuilder();
        // 格式化输出
        gsonBuilder.setPrettyPrinting();
        // 更改JSON对象key的名称
        gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
            
            @Override
            public String translateName(Field field) {
                if(field.getName().equals("age")) {
                    return "myage";
                }
                return field.getName();
            }
        });
        Gson gson = gsonBuilder.create();
        System.out.println(gson.toJson(zhangsan));
    }
}

2、解析JSON对象

  使用GSON解析JSON对象时,可以把JSON对象直接转换成Java Bean对象,不仅如此GSON还支持Java Bean的Date属性的数据的解析。并且数组类型的属性可以直接使用Java的集合类表示,GSON也可以方便地解析出来。

JSON解析成Java Bean对象

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.google.gson.Gson;
import com.zxt.demo.Person;
import com.zxt.json.ReadJSONTest;

public class ReadGsonTest {

    public static void main(String[] args) {
        File file = new File(ReadJSONTest.class.getResource("/zhangsan.json").getFile());
        try {
            String content = FileUtils.readFileToString(file);
            Gson gson = new Gson();
            // Gson可以直接由JSON字符串解析为Java Bena对象,JSONObject没有这个功能
            Person person = gson.fromJson(content, Person.class);
            System.out.println(person);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

GSON解析成带有日期格式的Java Bean对象

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.zxt.demo.PersonWithBirthday;
import com.zxt.json.ReadJSONTest;

public class ReadGsonWithDataTest {

    public static void main(String[] args) {
        File file = new File(ReadJSONTest.class.getResource("/zhangsan.json").getFile());
        try {
            String content = FileUtils.readFileToString(file);
            GsonBuilder gsonBuilder = new GsonBuilder();
            // 设置日期解析格式
            gsonBuilder.setDateFormat("yyyy-MM-dd");
            Gson gson = gsonBuilder.create();
            PersonWithBirthday person = gson.fromJson(content, PersonWithBirthday.class);
            System.out.println(person);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读