简单介绍 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);
}
相关推荐
一杯美式 no sugar1 分钟前
C++入门基础
开发语言·c++
大鹏说大话2 分钟前
AI 辅助编程革命:如何利用 GitHub Copilot 等工具重塑开发效率
开发语言
rit84324993 分钟前
有限元法求转子临界转速的MATLAB实现
开发语言·matlab
echome8883 分钟前
Python 异步编程实战:asyncio 核心概念与最佳实践
开发语言·网络·python
dreamxian4 分钟前
苍穹外卖day09
java·spring boot·tomcat·log4j·maven
剑海风云5 分钟前
JDK 26之安全增强
java·开发语言·安全·jdk26
左左右右左右摇晃7 分钟前
Java并发——多线程
java·开发语言·jvm
AMoon丶8 分钟前
Golang--内存管理
开发语言·后端·算法·缓存·golang·os
阿里嘎多学长8 分钟前
2026-03-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管
23.10 分钟前
【Java】字符串底层与常量池演变全解析
java·开发语言·jvm