简单介绍 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);
}
相关推荐
鶴哥只手遮天6 分钟前
Spring Framework 7.0.9 深度剖析-06-Bean 生命周期与依赖注入原理
java·后端·开源
唐钰小宝B15 分钟前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
golang学习记23 分钟前
最新版VS Code开发Spring Boot项目保姆级教程
java·spring boot·vscode·后端
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
叶总没有会1 小时前
RabbitMQ基础--java客户端
java·rabbitmq·java-rabbitmq
熊猫钓鱼>_>1 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃1 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
鶴哥只手遮天1 小时前
Spring Framework 7.0.9 深度剖析-03-IoC 容器核心:BeanFactory 与 BeanDefinition 体系
java·后端·开源
ydjs678899-bot2 小时前
如何在Java中打印pdf静默打印和打印对话框选择
java·python·pdf