简单介绍 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);
}
相关推荐
考虑考虑11 小时前
JDK25模块导入声明
java·后端·java ee
_小马快跑_12 小时前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
Re_zero14 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记14 小时前
Spring Boot条件注解详解
java·spring boot
程序员清风1 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5511 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊2 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing2 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot