【Java知识点整理】JSON

优化拼接字符串

String

  • 是复合类型 ,相当于char的数组

  • 是final类,也就是不支持继承

    public final class String {
          
          
        private final char value[];
    。。。。
    }
    
    • 低层分析:当String字符串进行拼接的时候,会创建一个新的char数组。

      **即:**每次对String对象进行操作,都需要创建新的对象,把数据一个个拷贝到新的空间。

    • **缺点:**占用了更多的空间,速度也慢。

如何解决这个问题?

  • 使用StringBuffer,同样是String对象,但是可以被多次修改。

StringBuffer——带同步块Synchronized,适合多线程使用,速度较慢

StringBuilder—— 新增的等价类,不带同步块,所以单线程使用,速度较快

3、面试题:三者区别

1、String 是字符串常量,对象一旦创建不可更改,这就导致**字符串常量池中没有所需的对象,**每次对String对象进行操作都会创建一个新的String对象,不仅效率低下还会浪费大量的内存空间。

2、StringBuffer和StringBuilder,是字符串变量,是可以改变的对象,和String不同的是,前者两个类型的对象能够被多次修改,且不产生新的未使用的对象。

3、StringBuffer和StringBuilder的差别在于:StringBuffer是线程安全的,StringBuilder是JDK新增的单个线程使用的等价类,也就是线程不安全的。

所以通常来说StringBuffer更安全(多线程),StringBuilder更快(单线程用)


JSON JavaScript Object Notation

目前已学的数据交互格式:

  • 拼接字符串:客户端 将信息拼接成字符串,再发送给服务器

    客户端<——拼接字符串——>服务端

  • XML格式:拓展标记语言(也是将字符串拼接成XML格式)

    • 常用于HTML
    • 缺点:比较重、麻烦——打包和解包麻烦 (多加了很多新的字符)
  • JSON格式:

1、认识JSON

  • JavaScript Object Notation 一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换
    • 易于机器解析和生成。
    • 本质上就是将对象——转换为——>字符串

2、JSON的两种结构

  • 对象用大括号表示{}

  • 列表用中括号表示[]

  • 语法如下

    [
        {
          
          
            key1:value1,
            key2:value2 
        },
        {
          
          
             key3:value3,
             key4:value4   
        }
    ]
    
  • 举个例子

    // 对象:
    {
          
          
    "friendId":"1001",
    "groupId":7,
    "qqid":"1003",
    "friendName":"小美1"
    }
    // 列表,(存放多个对象时可以分别用大括号表示
    [
        {
          
          
            "friendId":"1001",
    		"groupId":7,
    		"qqid":"1003",
    		"friendName":"小美1"
        },
        {
          
          
             "friendId":"1001",
    		"groupId":7,
    		"qqid":"1003",
    		"friendName":"小美1"
        }
    ]
    

3、JSON的用法

JSON是一种规范,就提供了工具包,这里使用阿里巴巴的包FASTJSON.jar

这里展示的JSON用法就是基于FASTJSON包来使用的。

最新下载地址github.com/alibaba/fastjson/wiki

⭐️JSON 字符串、JSON 对象、Bean 对象、集合对象之间的相互转换

  • 重要!!对象的属性权限要注意!类和属性也需要public公开的权限或者有公开的访问方式

  • 字符串 —— 对象

    • JSONObject.toJSONString:对象转字符串
    • JSONObject.parseObject(字符串, 类名.class);:字符串转换成对应的对象
  • 字符串——集合对象

    • JSONArray.toJSONString:集合转字符串
    • JSONArray.parseArray(字符串, 元素类名.class):字符串转集合
  • 字符串——JSON对象

    • JSONObject 本质是一种存放键值对映射的map格式的对象。可以使用put(key,value)插入元素
    • JSONObject.toJSONString一样,对象转字符串
    • JSONObject jsonObjNew = JSONObject.parseObject(jsonStr);:字符串转JSON对象
package com;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class JSONDemo2 {
    
    
    public static void main(String[] args) {
    
    
        // 声明学生对象
        Student stu1 = new Student("小A" , 15 , 001 ,"福建省厦门市思明区");
        Student stu2 = new Student("小B" , 11 , 002 ,"福建省福州市鼓楼区");
        Student stu3 = new Student("小C" , 17 , 003 ,"福建省泉州市丰泽区");

        // 声明一个列表存储对象
        ArrayList<Student> stuList = new ArrayList<>();
        stuList.add(stu1);
        stuList.add(stu2);
        stuList.add(stu3);

        // 1、JSON 字符串 —— 对象
        String stu1Json = JSONObject.toJSONString(stu1);
        System.out.println("对象转字符串:"+stu1Json);

        Student stu1New = JSONObject.parseObject(stu1Json , Student.class);
        System.out.println("字符串转对象:  "+stu1New);

        // 2JSON字符串 —— 集合对象
        String listJson = JSONArray.toJSONString(stuList);
        System.out.println("集合转字符串:"+listJson);

        List<Student> studentList = JSONArray.parseArray(listJson, Student.class);
        System.out.println("字符串转数组:(长度)"+ studentList.size()+"(内容)"+studentList.get(0)+studentList.get(1)+studentList.get(2));

        // 3 JSON字符串 —— JSON对象
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type","学生信息");
        jsonObject.put("list",stuList); // json对象存放数组
        jsonObject.put("object",stu1);  // json对象存放对象

        String jsonStr = JSONObject.toJSONString(jsonObject);
        System.out.println("JSON对象转字符串:"+jsonStr);

        JSONObject jsonObjNew = JSONObject.parseObject(jsonStr);
        System.out.println(jsonObjNew.get("type"));
        System.out.println(jsonObjNew.get("list"));
        System.out.println(jsonObjNew.get("object"));
    }
}
package com;

public class Student {
    
    
    public String name;
    public int age;
    public int stuID;
    public String address;

    public Student(String name, int age, int stuID, String address) {
    
    
        this.name = name;
        this.age = age;
        this.stuID = stuID;
        this.address = address;
    }

    @Override
    public String toString() {
    
    
        return "Student类的值为:{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", stuID=" + stuID +
                ", address='" + address + '\'' +
                '}';
    }
}
输出结果
对象转字符串:{"address":"福建省厦门市思明区","age":15,"name":"小A","stuID":1}
字符串转对象:  Student类的值为:{name='小A', age=15, stuID=1, address='福建省厦门市思明区'}

集合转字符串:[{"address":"福建省厦门市思明区","age":15,"name":"小A","stuID":1},{"address":"福建省福州市鼓楼区","age":11,"name":"小B","stuID":2},{"address":"福建省泉州市丰泽区","age":17,"name":"小C","stuID":3}]
字符串转数组:(长度)3(内容)Student类的值为:{name='小A', age=15, stuID=1, address='福建省厦门市思明区'}Student类的值为:{name='小B', age=11, stuID=2, address='福建省福州市鼓楼区'}Student类的值为:{name='小C', age=17, stuID=3, address='福建省泉州市丰泽区'}

JSON对象转字符串:{"type":"学生信息","list":[{"address":"福建省厦门市思明区","age":15,"name":"小A","stuID":1},{"address":"福建省福州市鼓楼区","age":11,"name":"小B","stuID":2},{"address":"福建省泉州市丰泽区","age":17,"name":"小C","stuID":3}],"object":{"$ref":"$.list[0]"}}

学生信息
[{"address":"福建省厦门市思明区","stuID":1,"name":"小A","age":15},{"address":"福建省福州市鼓楼区","stuID":2,"name":"小B","age":11},{"address":"福建省泉州市丰泽区","stuID":3,"name":"小C","age":17}]
{"address":"福建省厦门市思明区","stuID":1,"name":"小A","age":15}

4、如何让客户端判断接受的是什么对象?

因为JSON对象本质上就是键值对的类型 (MAP),就可以将要传递的对象打包为一个JSONObject对象

具体方法(发送端,打包)

  1. 创建一个JSONObject对象
  2. 使用put(key,value)的方法将信息存入
  3. 第一个信息就固定表示这个对象存储的类型
  4. 将这个对象转换为JSON格式的字符串
  5. 传递这个字符串即可

(接收端:打包

  1. 使用JSONObject.parseObject方法将字符串转换为JSONObject对象

  2. 使用JSONObject的成员方法,即可获得对应的value

    • getString(key):获得字符串型的对象

    • getJSONArray:获得列表型的对象。具体转换方法

      JSONArray jsonAry = jsonObject.getJSONArray("list");
      List<QQGroup> list = jsonAry.toJavaList(QQ.class);
      

补充知识点:XML语言(Extensible Markup Language)。

  • XML 指可扩展标记语言。是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

  • XML有以下特点:

    1. XML可以从HTML中分离数据
    2. XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。
    3. XML可应用于B2B中。目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言。例如在网络中交换金融信息。
    4. 利用XML可以共享数据。XML数据以纯文本格式存储,使不同系统、不同程序之间的数据共享变得更加简单。
    5. XML可以充分利用数据。就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理
    6. XML可以用于创建新的语言。WAP和WML语言都是由XML发展来的。

    总之,XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

补充知识点:XML和JSON的区别

1、JSON是JavaScript Object Notation;XML是可扩展标记语言。

2、JSON是基于JavaScript语言;XML源自SGML。

3、JSON是一种表示对象的方式;XML是一种标记语言,使用标记结构来表示数据项。

4、JSON不提供对命名空间的任何支持;XML支持名称空间。

5、JSON支持数组;XML不支持数组。

6、XML的文件相对难以阅读和解释;与XML相比,JSON的文件非常易于阅读。

7、JSON不使用结束标记;XML有开始和结束标签。

8、JSON的安全性较低;XML比JSON更安全。

9、JSON不支持注释;XML支持注释。

10、JSON仅支持UTF-8编码;XML支持各种编码

原文

猜你喜欢

转载自blog.csdn.net/Xcong_Zhu/article/details/126082889