JSON串

JSON在客户端的使用

JSON 字符串的格式是基于键值对的数据结构,用于表示结构化数据。它遵循严格的语法规则,常用于前后端数据交互。

1. 基本结构

  • JSON 数据结构由两种主要元素构成:
    • 对象(Object) :用花括号 {} 包围,包含键值对。
    • 数组(Array) :用方括号 [] 包围,包含多个值。
JSON 对象示例:
javascript 复制代码
{ "name": "张三", "age": 25, "isStudent": true }
JSON 数组示例:
javascript 复制代码
{ "subjects": ["Math", "Science", "History"] }

2. 数据类型

JSON 支持以下几种数据类型:

  • 字符串(String) :必须用双引号 "" 括起来。
  • 数字(Number):整数或浮点数,不需要引号。
  • 布尔值(Boolean)truefalse,不需要引号。
  • 数组(Array) :方括号 [] 包围,里面可以是任意类型的数据。
  • 对象(Object) :花括号 {} 包围,里面是键值对。
  • 空值(null):表示空值,不需要引号。
示例:
javascript 复制代码
{ "name": "张三", "age": 25, "isStudent": true,
 "grades": [85, 90, 95], "address": { "city": "北京", "postalCode": "100000" }, 
"graduationYear": null }

3. 语法规则

  • 双引号 :所有的键名(key)和字符串类型的值都必须使用双引号 "",而不能使用单引号 '
  • 键值对 :每对键和值之间用冒号 : 分隔。
  • 逗号分隔 :多个键值对之间、数组元素之间必须用逗号 , 分隔,但最后一个元素后面不能有逗号。
  • 空格:可以在 JSON 字符串中添加空格或缩进以提高可读性,这对 JSON 解析没有影响。
示例:
javascript 复制代码
{ "name": "张三", "age": 25, "isStudent": true, 
"subjects": ["Math", "Science", "History"] }

4. 嵌套结构

JSON 支持对象和数组的嵌套,这使得它能够表达复杂的结构。

示例:
javascript 复制代码
{ "name": "张三", "age": 25, 
"dog": { "name": "小花", "age": 3 }, 
"friends": [ { "name": "李四", "age": 24 }, { "name": "王五", "age": 26 } ] 
}

在这个例子中,dog 是一个嵌套的对象,而 friends 是一个包含多个对象的数组。

将JSON串转为对象以及把对象转为JSON串的例子

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        // 定义一个符合JSON格式的字符串
        var personStr = '{ "name": "张三", "age": 10, 
        "dog": { "dname": "小花" }, "loveSingers": ["张小明", "王小东", "李小黑"],
        "friends": [{"fname": "李四"}, {"fname": "张三"}] }';
        // 通过JSON.parse()可以把一个JSON字符串转换为一个对象
        var person = JSON.parse(personStr);
        // console.log(personStr);
        // console.log(person);
        console.log(person.name);
        console.log(person.age);
        console.log(person.dog.dname);
        console.log(person.loveSingers[0]);
        console.log(person.friends[0].fname);

        // 通过JSON.stringify() 将一个对象转换为JSON串
        var personStr2 = JSON.stringify(person);
    </script>
</head>
<body>

</body>
</html>

JSON在服务器端的使用

1. 将对象转换为 JSON 字符串

这个过程称为 序列化(Serialization),它将 Java 对象转换为 JSON 字符串,以便可以通过 HTTP 传输或者存储到数据库中。

核心步骤:

下载包的地址:

下载后搜索Jacksonhttps://mvnrepository.com/

  • 调用 writeValueAsString(Object) 方法,将 Java 对象转换为 JSON 字符串。
java 复制代码
public static void ObjectToString() throws JsonProcessingException {
    // 创建对象
    Dog dog = new Dog("招财");
    Person person = new Person("张三", 10, dog);

    // 将对象转换为 JSON 字符串
    ObjectMapper objectMapper = new ObjectMapper();
    String personStr = objectMapper.writeValueAsString(person);

    // 输出 JSON 字符串
    System.out.println(personStr);
}

输出:

java 复制代码
{
  "name": "张三",
  "age": 10,
  "dog": {
    "name": "招财"
  }
}

2. 将 JSON 字符串转换为 Java 对象

这个过程称为 反序列化(Deserialization),它将 JSON 字符串转换为 Java 对象,以便在后端进行进一步的业务逻辑处理。

核心步骤:
  • 使用 ObjectMapper 类。
  • 调用 readValue(String, Class<T>) 方法,将 JSON 字符串转换为指定类型的 Java 对象。
java 复制代码
public static void JsonToEObject() throws JsonProcessingException {
    // JSON 字符串
    String personStr = "{\"name\":\"张三\",\"age\":10,\"dog\":{\"name\":\"招财\"}}";

    // 将 JSON 字符串转换为对象
    ObjectMapper objectMapper = new ObjectMapper();
    Person person = objectMapper.readValue(personStr, Person.class);

    // 输出对象
    System.out.println(person);
}

调式时的控制台:

3. 总结:如何在服务器端进行 JSON 和对象之间的转换

对象转换为 JSON 字符串(序列化)
  • 用途:当你需要将对象通过网络传输或存储为文本(如数据库中)时,通常将 Java 对象转换为 JSON 字符串。
  • 步骤
    1. 创建一个 Java 对象。
    2. 使用 ObjectMapper.writeValueAsString() 方法将对象转换为 JSON 字符串。
  • 常见场景
    • 将后端生成的对象通过 HTTP 响应发送到前端。
    • 将对象持久化为 JSON 格式存储。
JSON 字符串转换为对象(反序列化)
  • 用途:当你从外部接收到 JSON 数据(比如从前端接收到请求数据,或从数据库中读取 JSON 字符串)时,你通常需要将 JSON 字符串转换为 Java 对象进行处理。

  • 步骤

    1. 获取 JSON 字符串(从 HTTP 请求、数据库等)。
    2. 使用 ObjectMapper.readValue() 方法将 JSON 字符串转换为 Java 对象。
  • 常见场景

    • 从前端接收 JSON 请求体,将其转换为后端的业务对象。
    • 从数据库中读取存储的 JSON 数据,将其解析为对象用于处理。

JSON和Map/List/Array之间的转换:

1. JSON 和 Map 之间的转换

  • Map 是一种键值对的数据结构,适合与 JSON 对象的格式进行转换,因为 JSON 对象也是键值对的形式。
  • 在 Jackson 中,可以轻松地将 JSON 字符串转换为 Map<String, Object>,或者将 Map 转换为 JSON 字符串。
1.1 将 JSON 转换为 Map

使用 ObjectMapperreadValue() 方法将 JSON 字符串转换为 Map<String, Object>

java 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;

public class JsonToMapExample {
    public static void main(String[] args) throws Exception {
        String jsonStr = "{\"name\":\"张三\", \"age\":30, \"dog\":{\"name\":\"小花\"}}";

        // 创建 ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();

        // 将 JSON 转换为 Map
        Map<String, Object> resultMap = objectMapper.readValue(jsonStr, Map.class);
        
        // 输出 Map 内容
        System.out.println(resultMap);
    }
}

1.2 Map 转换为 JSON

java 复制代码
 public  static void MapToJson() throws JsonProcessingException {
        Map data = new HashMap();
        data.put("a","value");
        data.put("b","value");

        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(data);
        System.out.println(s);
    }

2. JSON 和 List 之间的转换

  • List 是一种有序的集合,适合与 JSON 数组进行相互转换。
  • 在 Jackson 中,List 和 JSON 数组之间的转换也是通过 ObjectMapper 实现的。
2.1 将 JSON 数组转换为 List

JSON 数组可以直接转换为 List,可以是 List<String>List<Integer>List<Map<String, Object>> 等。

java 复制代码
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;

public class JsonToListExample {
    public static void main(String[] args) throws Exception {
        String jsonArrayStr = "[\"张三\", \"李四\", \"王五\"]";

        // 创建 ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();

        // 将 JSON 数组转换为 List
        List<String> resultList = objectMapper.readValue(jsonArrayStr, new TypeReference<List<String>>() {});

        // 输出 List 内容
        System.out.println(resultList);
    }
}
2.2 List 转换为 JSON 数组

使用 writeValueAsString() 方法可以将 List 转换为 JSON 数组。

java 复制代码
   public  static void ListToJson() throws JsonProcessingException {
//        List<String> data1 = new ArrayList<String>();
//        data1.add("a");
//        data1.add("b");
//        data1.add("c");
//
//        String [] data2 = {"a","b","c"};

        Dog dog = new Dog("招财");
        Person person = new Person("张三",10,dog);
        List<Person> data = new ArrayList<Person>();
        data.add(person);
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(data);
        System.out.println(s);
    }
相关推荐
九圣残炎几秒前
【从零开始的LeetCode-算法】3354. 使数组元素等于零
java·算法·leetcode
初遇你时动了情31 分钟前
uniapp 城市选择插件
开发语言·javascript·uni-app
天天扭码35 分钟前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
程序猿小柒41 分钟前
leetcode hot100【LeetCode 4.寻找两个正序数组的中位数】java实现
java·算法·leetcode
不爱学习的YY酱1 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
zongzi_4941 小时前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
丁总学Java1 小时前
Maven项目打包,com.sun.tools.javac.processing
java·maven
kikyo哎哟喂2 小时前
Java 代理模式详解
java·开发语言·代理模式
麻辣_水煮鱼2 小时前
vue数据变化但页面不变
前端·javascript·vue.js
duration~2 小时前
SpringAOP模拟实现
java·开发语言