简单介绍 JSON

JSON : JavaScript Object Notation

JSON 是一种轻量级,纯文本的数据交互格式 , 独立与编程语言 , 几乎所有主流语言(Java,Python,JS,GO)都支持解析和生成

1. 基础语法 :

  1. 数据以键值对形式存在 , 键必须为双引号
  2. 数据之间使用逗号分隔
  3. { }表示对象 , [ ] 表示数组
  4. 支持数据类型 : 字符串 , 数组 , 布尔值 , null , 对象 , 数组
  5. 不支持注释 , 函数 , undefined

2. 两种数据结构 :

  1. 对象 : 大括号 { } 保存的对象是一个 无序的键值对 集合 , 一个对象 左括号{ 开始 , 右括号 } 结束 , 每个 键 后跟一个冒号 , 键值对使用逗号分隔
  2. 数组 : 中括号 [ ] 保存的数组是值(value)的有序集合 , 一个数组以左括号 [ 开始 , 右括号 ] 结束 , 值之间使用逗号分隔

简单示例 :

javascript 复制代码
{
  "name": "小明",
  "age": 20,
  "isStudent": true,
  "hobbies": ["读书", "编程"],
  "address": {
    "city": "北京",
    "district": "海淀"
  },
  "score": null
}

3.JSON 字符串和 Java 对象互传

在 Java 中 , 最成熟的 JSON 处理库有 3 个 : Jackson(Spring 框架内置) , Gson(google) , Fastjson(阿里)

下面以 Jackson 为例 :

java 复制代码
public class UserInfo {
    private String name;
    private int gender;
    private int age;

    public UserInfo() {
    }

    public UserInfo(String name, int gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                '}';
    }
}

注意 : 如果不用 Lombok , 必须手动编写 无参构造器和所有属性的 get/set 方法 , 否则 Jackson 无法正常解析

①Java 对象 ->JSON 字符串(序列化)

序列化 : 使用 objectmapper.writeVakueAsString(Java 对象) -> 生成 JSON 字符串

java 复制代码
//java->json
private static final ObjectMapper objectmapper = new ObjectMapper();

public static void main(String[] args) {
    //创建json对象
    UserInfo s1 = new UserInfo("张三",1,18);
    //序列化
    String str1 = objectmapper.writeValueAsString(s1);

    System.out.println(str1);
}

②JSON 字符串->Java 对象

反序列化 : objectmapper.readValue(Json 字符串 , 目标类.class)

java 复制代码
private static final ObjectMapper objectmapper = new ObjectMapper();
public static void main(String[] args) {
    //Json字符串
    String jstr1 = "{\"name\":\"张三\",\"gender\":1,\"age\":18}";
    //反序列化
    UserInfo s1 = objectmapper.readValue(jstr1,UserInfo.class);

    System.out.println(s1);
}

③ 处理集合类型

如果需要转换集合 , 需要用 TypeReference 指定泛型类型

java 复制代码
private static final ObjectMapper objectmapper = new ObjectMapper();
public static void main(String[] args) {
    //json数组字符串
    String jsonArrStr = "[{\"name\":\"张三\",\"gender\":1,\"age\":18},{\"name\":\"李四\",\"gender\":1,\"age\":98}]";
    //反序列化为List<UserInfo>
    List<UserInfo> list = objectmapper.readValue(jsonArrStr, new TypeReference<List<UserInfo>>() {
        @Override
        public Type getType() {
            return super.getType();
        }
    });
    list.forEach(System.out::println);
}
相关推荐
FQNmxDG4S2 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人2 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang3 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全3 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje3 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv73 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫3 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287923 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本3 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab4 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang