什么是JSON

JSON(JavaScript Object Notation) 是一种与开发语言无关的、轻量级的 数据格式;重点记住,它是一种数据格式 ;


特点

非常易于人的阅读和编写,同时也很容易被程序解析 ;


JSON的数据结构 – Object

使用花括号 {} 括起来的键值对结构,其中 key 必须是 String 类型,value任何 基本类型数据结构

其中键值对内部使用冒号 : 连接, 键值对之间使用逗号 , 连接 ;


JSON的数据结构 – Array

使用中括号 [] 括起来,元素之间使用逗号 , 分隔 ;

元素也是可以为 任何 类型 ;


JSON的数据结构 – 基本类型

JSON 的基本类型有 5 种:

  • string 代表字符串 ,字符串需要用双引号 " " 括起来 ;
  • number 数值类型,JSON 中只有一个 number 类型,是没有 int float double 这些类型的 ;
  • true/false 布尔类型
  • null JSON 中也定义了一个代表 的关键字 ;

可以看见 JSON 好多的格式,都不支持,比如 日期 类型,这也是 JSON 的一个缺点,下面介绍的 GSON 弥补了这一缺点 ;


构建 JSON 数据

  1. 使用 JSONObject 对象构建 JSON 数据

    	@Test
    public void object2Json(){ // 定义一个 null 对象 ;
    Object NULL = null ; // 利用 jsonObject 对象,构建 JSON
    JSONObject jsonObject = new JSONObject() ;
    jsonObject.put("name","yaz") ;
    jsonObject.put("sex","男") ;
    // 日期类型,用字符串,JSON 里面没有日期类型
    jsonObject.put("birthday","1997-01-22") ;
    // 插入数字的时候,java的数值类型,最后都会被转为 JSON 的number 类型
    jsonObject.put("salary",5000.00) ;
    jsonObject.put("age",22) ;
    jsonObject.put("hasHouse",false) ;
    // 直接传入 null ,编译不通过,因为 put 重载了 Collection 和 map 集合 ;
    // 直接传入 null ,就不知道具体调用哪一个了
    // 定义一个 null 对象,绕过编译 ;
    // 值为 null 的属性,不会被传入到 JSON 中 ;
    jsonObject.put("hasDream",NULL) ;
    jsonObject.put("habit",new String[]{"LOL","打乒乓球","java-IT"}) ; System.out.println(jsonObject.toString());
    }

    生成的 JSON 字符串 :

    {
    "birthday": "1997-01-22",
    "sex": "男",
    "habit": [
    "LOL",
    "打乒乓球",
    "java-IT"
    ],
    "hasHouse": false,
    "age": 22,
    "name": "yaz",
    "salary": 5000
    }
  2. 使用 Map 对象构建 JSON 数据

    	@Test
    public void map2Json(){
    Map<String,Object> map = new HashMap<>();
    map.put("name","yaz") ;
    map.put("age",22) ;
    map.put("birthday","97-01-22") ;
    map.put("salary",5000.1) ;
    map.put("habit",new String[]{"LOL","Music","sleep"}) ;
    map.put("hasHouse",false) ;
    map.put("car",null) ; // 还是需要 JSONObject ,将 map 传入
    JSONObject jsonObject = new JSONObject(map) ; System.out.println(jsonObject);
    }

    生成的 JSON 字符串 :

    {
    "birthday": "97-01-22",
    "habit": [
    "LOL",
    "Music",
    "sleep"
    ],
    "hasHouse": false,
    "name": "yaz",
    "age": 22,
    "salary": 5000.1
    }
  3. 使用 Javabean 对象构建 JSON 数据 (推荐使用)

       @Test
    public void Javabean2Json(){
    Customer customer = new Customer() ;
    customer.setAge(20);
    customer.setBirtyday("97-02-28");
    customer.setCarName(null);
    customer.setHabit(new String[]{"lol","java-IT"});
    customer.setSalary(5000.1);
    customer.setHasHouse(false); JSONObject jsonObject = new JSONObject(customer);
    System.out.println(jsonObject);
    }

    生成的 JSON 字符串 :

    {
    "birtyday": "97-02-28",
    "habit": [
    "lol",
    "java-IT"
    ],
    "hasHouse": false,
    "age": 20,
    "salary": 5000.1
    }

总结:

  1. 生成 JSON 串,都需要 JSONObject 对象 ,可以往里面一个一个属性的 put ,也可以直接传给它一个 map ,或者一个 Javabean 对象;
  2. 属性为 null 的属性,是不会为添加到 JSON 串中的 ;

解析 JSON 数据

  1. 从文件中读取 JSON

  2. 解析数组

    这里有个缺点:JSON 的工具类不能直接解析数组,需要使用 JSONArray 类辅助下 ;

  3. 判断 null

    使用 jsonObject.isNull("键") 判断对应的属性,是否存在 ; ;

        @Test
    public void json2Object() throws IOException {
    // 获取 json 串所在的文件
    File file = new File(this.getClass().getClassLoader().getResource("jsonString.txt").getFile());
    // 使用 Apache 的 fileUtils工具,读取文本文件内容,转成字符串
    String json = FileUtils.readFileToString(file, "UTF-8");
    // 还是使用 JSONObject 对象
    JSONObject jsonObject = new JSONObject(json); // 读取 JSON 串的内容
    // 判断 是否有 name 属性,如果没有,则不读取;
    if (!jsonObject.isNull("name")) {
    System.out.println("name" + jsonObject.getString("name"));
    }
    System.out.println("age" + jsonObject.getInt("age"));
    System.out.println("salary" + jsonObject.getInt("salary"));
    // 但是读取数组,需要使用另外一个对象
    JSONArray jsonArray = jsonObject.getJSONArray("habit");
    for (int i = 0; i < jsonArray.length(); i++) {
    // 需要强转下
    String habit = (String) jsonArray.get(i);
    System.out.println("habit " + i + ":" + habit);
    } }

    这里有个坑:地址的写法,注意了,之前的写法,一直不好使,最后,直接建立一个资源文件,扔下面,然后访问到了

总结:解析 JSON 串的时候,需要我们自己一个一个的去获取属性,对于数组属性,还需要强转,因为它不知道里面的具体类型 ;


GSON

Google 的一个开源项目,对 JSON 进行了增强,比如支持了日期类型;


构建 GSON

 @Test
public void object2Gson() throws ParseException {
CustomerWithDate customerWithDate = new CustomerWithDate();
customerWithDate.setAge(22);
customerWithDate.setName("yaz");
customerWithDate.setBirtyday(new SimpleDateFormat("yyyy-mm-dd").parse("1997-1-22"));
customerWithDate.setHabit(new String[]{"lol", "java"});
// 这个不会得到构建
customerWithDate.setPassword("sasas");
// 美化输出样式,使用 GsonBuilder
GsonBuilder gsonBuilder = new GsonBuilder();
// 进行个性化定制输出,也就是在构建的时候,对字段进行一些设定
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field field) {
if ("name".equals(field.getName())){
return "YAZZZZ" ;
}
return field.getName();
}
}) ; gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
System.out.println(gson.toJson(customerWithDate));
}

使用 Javabean 或者 map 对象 都可以,toJson 操作,参数是一个 object 类型 ;


解析 GSON

可以解析成自己的对象,而不是像 JSON 那样,解析成 JSONObject 对象 ;

   @Test
public void gson2Object() throws IOException {
// 获取 json 串所在的文件
// 地址的写法,注意了,之前的写法,一直不好使,直接建立一个资源文件,扔下面,然后访问到了
File file = new File(this.getClass().getClassLoader().getResource("jsonString.txt").getFile());
// 使用 Apache 的 fileUtils工具,读取文本文件内容,转成字符串
String json = FileUtils.readFileToString(file, "UTF-8");
// 创建一个 支持解析日期 的 gson
Gson gson = new GsonBuilder().setDateFormat("yyyy-mm-dd").create() ;
CustomerWithDate customerWithDate = gson.fromJson(json,CustomerWithDate.class);
System.out.println(customerWithDate);
}

对比 JSON 的强大之处

  1. 支持改变生成 JSON 的属性名(别名)

        /**
    * 设置别名,使用注解
    */
    @SerializedName("NAME")
    private String name;
  2. 美化输出

    //        美化输出样式,使用 GsonBuilder
    GsonBuilder gsonBuilder = new GsonBuilder() ;
    // 设置成漂亮的输出
    gsonBuilder.setPrettyPrinting();
  3. 在解析的过程中,进行个性化定制

    //        进行个性化定制输出,也就是在构建的时候,对字段进行一些设定
    gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
    @Override
    public String translateName(Field field) {
    if ("name".equals(field.getName())){
    return "YAZZZZ" ;
    }
    return field.getName();
    }
    }) ;
  4. 忽略掉某些 Javabean 的属性

    // 使用关键字 transient  在构建 JSON 的时候,会忽略掉该属性
    private transient String password;
  5. 支持解析日期

    设定日期解析格式 ;

    //        创建一个 支持解析日期 的 gson
    Gson gson = new GsonBuilder().setDateFormat("yyyy-mm-dd").create() ;
  6. 支持 JSON Array 数组到 java 集合类的无缝转换

    说的是,对于 JSONArray 数组,我们在 java 里面是可以直接用 集合 接收的, GSON 会自动的转换 ;

JSON、GSON的更多相关文章

  1. Android JSON、GSON、FastJson的封装与解析

    声明: 1.本帖只提供代码,不深入讲解原理.如果读者想要深入了解,那就不要在这个帖子上浪费时间了 2.客户端用的是Google官方的Volley访问服务器,具体了解Volley请戳 这里 3.本帖三种 ...

  2. 处理json的常用java类库:Json-lib(org.json)、Gson、Jackson、Fastjson

    更多的处理json的java类库,有人做了性能对比,GitHub地址:https://github.com/fabienrenaud/java-json-benchmark 处理json的java类库 ...

  3. Android进阶笔记17:3种JSON解析工具(org.json、fastjson、gson)

    一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...

  4. FastJson、Jackson、Gson进行Java对象转换Json细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  5. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  6. Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)

    一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...

  7. 原生态的ajax 及json和gson学习资源

    @RequestMapping(value = "/{id}/view") @jsobody public String viewProject( @PathVariable(&q ...

  8. Json与Gson讲解

    1 json的含义: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于 ...

  9. Java 常见数据交换格式——xml、json、yaml

    目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...

随机推荐

  1. 【原创】go语言学习(十)Map类型

    目录 声明和初始化 基本操作 map排序 map类型的切⽚片 课后作业 声明和初始化 1.map类型是⼀一个key-value的数据结构. //var a map[key的类型]value类型 var ...

  2. RSYNC @ERROR: AUTH FAILED ON MODULE XXX 解决思路及附录RSYNC常见问题及解决办法

    使用rsync往服务器上传文件时,client报如下异常: @ERROR: auth failed on module XXX rsync error: error starting client-s ...

  3. Tkinter 之Combobox下拉

    一.参数说明 语法 作用 cv = tk.stringVar() 绑定变量 com = ttk.Combobox(root, textvariable=cv) 创建下拉框 com.pack() 放置下 ...

  4. [WEB安全]XXE漏洞总结

    目录 0x00 XML基础 0x01 XML文档结构 0x02 DTD 0x03 实体 0x04 XXE漏洞 0x05 总结一些payload 0x06 XXE漏洞修复与防御 0x07 参考链接 0x ...

  5. MovingWallVelocity边界条件【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/59646-movingwallvelocity-bound ...

  6. Java枚举知识点

    近几天从单例模式及阿里开发手册中遇到枚举,之前没怎么关注过. 便学习一下,此次看了多方资料,并写Demo实现,记录下知识点,方便之后巩固. 枚举的两个优点: 1. 保证了类型安全:调用者无法随意传一个 ...

  7. .prop() vs .attr()

    .prop() vs .attr() Update 1 November 2012 My original answer applies specifically to jQuery 1.6. My ...

  8. gis空间分析案例教程-下篇预告

    1. 三维空间坐标转换,地理处理工具 2. 3参数,7参数计算,地理处理工具 3. 3参数,7参数坐标转换,地理处理工具 4. 坐标转换工具箱:集成高斯投影,参数计算,坐标转换所有功能. 作业:GIS ...

  9. 解压命令unzip常用方法汇总

    解压命令unzip常用方法汇总: 1.把文件解压到当前目录下 1 unzip pythontab.com.zip 2.如果要把文件解压到指定的目录下,需要用到-d参数. 1 unzip -d ./tm ...

  10. web手工项目03-登录功能测试用例及缺陷编写-流程图画法-前后台下单及发货流程图-流程图设计测试用例方法-功能测试涉及到的四种数据库场景

    回顾 注册功能测试(步骤,需求分析(输入分析,处理分析,输出分析),数据构造(有效等价类,无效等价类,有效数据,无效数据),编写用例,执行用例,缺陷报告) 轮播图功能测试(步骤,需求分析拆分测试点,测 ...