简单介绍 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);
}
相关推荐
JackieZhengChina12 分钟前
零依赖轻量级JS悬浮提示插件title2tip-js的使用教程
开发语言·javascript·ecmascript
MindUp17 分钟前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG47726 分钟前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
程序员天天困1 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
战血石LoveYY1 小时前
Integer类型超限,导致数据异常
java·算法
李永奉1 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug
m0_617493942 小时前
Python OpenCV 透视变换(Perspective Transform)详解与实战
开发语言·python·opencv
程序猿编码2 小时前
用C++从零开始造一个微型GPT,不借助任何第三方库
开发语言·c++·gpt·模型推理
普通网友2 小时前
pytest一些常见的插件
开发语言·python·pytest
苦瓜花2 小时前
【Kotlin】初入门
android·开发语言·kotlin