共计 7198 个字符,预计需要花费 18 分钟才能阅读完成。
JSON 是什么?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON 基于 JavaScript 的一个子集,但它独立于任何语言,因此可以在多种编程环境中使用,包括但不限于 JavaScript、Java、Python 等。
JSON 的基本结构:
数据在名称 / 值对中:数据以键值对的形式存储,类似于 JavaScript 中的对象。
数据由逗号分隔:每个键值对之间使用逗号分隔。
花括号保存对象:使用 {} 来表示一个 JSON 对象。
方括号保存数组:使用 [] 来表示一个 JSON 数组。
JSON 数据结构类型(语法):
对象:由大括号 {} 包围的一系列无序的键值对组成,其中键必须是字符串,而值可以是任意有效的 JSON 数据类型。
数组:由方括号 [] 包围的一系列值组成,值之间用逗号 , 分隔。
字符串:由双引号 ” 包围的零个或多个 Unicode 字符序列,支持转义字符。
数字:可以是整数或浮点数,支持科学记数法,但不支持无穷大或 NaN 这样的特殊值。
布尔值:可以是 true 或 false。
null:表示没有值或空值。
简单示例
例如,一个简单的 JSON 数据可能如下所示:
{
"name": "John",
"age": 25,
"phoneNumber": [{"type": "home", "number": "123-456-7890"},
{"type": "mobile", "number": "098-765-4321"}
]
}
示例解读:
对象: 整段 JSON 数据是一个对象,由大括号 {} 包围,包含三个键值对。
键值对: 键是字符串,值可以是各种数据类型,包括字符串、数字、数组、对象或 null。在这个例子中,我们有三个键:”name”、”age” 和 “phoneNumber”。
数组: “phoneNumber” 的值是一个数组,由方括号 [] 包围。数组可以包含任意数量的元素,元素间用逗号 , 分隔。
数组中的对象: 数组的每个元素本身也是一个对象,具有自己的键值对。在这里,每个电话号码都是一个对象,包含 “type” 和 “number” 这两个键值对。
这个 JSON 数据可以用在多种场景中,比如在 Web 应用中存储用户信息,或者在 API 调用中传递用户数据。在 JavaScript 中,你可以直接将这段 JSON 字符串解析成一个对象,然后像操作普通对象一样访问其属性和方法。
// 例如,在 JavaScript 中,你可以这样获取名字:const data = JSON.parse('{"name":"John","age": 25,"phoneNumber": [{"type":"home","number":"123-456-7890"},{"type":"mobile","number":"098-765-4321"}]}');
console.log(data.name); // 输出: John
// 同样,你也可以轻松地访问电话号码数组中的某个特定电话号码:console.log(data.phoneNumber[0].number); // 输出: 123-456-7890
注意事项:
JSON 中的所有字符串都必须使用双引号包围,即使键也是如此。
JSON 不允许单行或多行注释。
JSON 不允许使用变量或函数调用,它只允许静态数据。
JSON 中的数组元素和对象成员的顺序在不同的实现中可能会有所不同,尽管它们通常按照输入顺序输出。
JSON 名称 (
name
)置于 双引号 中,值(value
)有 字符串、数值、布尔值、null、对象和数组。
JSON 与 XML 的区别
JSON (JavaScript Object Notation) 和 XML (eXtensible Markup Language) 都是用于存储和传输数据的格式,但是它们有着显著的不同之处。下面是 JSON 和 XML 的一些关键区别:
JSON
语法:JSON 使用更简洁的语法,基于 JavaScript 的对象表示法,易于阅读和编写。
数据结构:JSON 主要使用键值对(对象)和数组来表示数据。
解析速度:由于 JSON 格式简单,解析速度通常比 XML 快。
与 JavaScript 的集成:JSON 在 JavaScript 中可以直接转换为对象,无需额外的解析步骤。
文件大小:JSON 文件通常比 XML 更小,因为 JSON 使用较少的字符来表示相同的数据。
支持的数据类型:JSON 支持字符串、数字、布尔值、数组、对象和 null。
XML
语法:XML 使用标签来表示数据,语法较为冗长,但提供了更丰富的结构化信息。
数据结构:XML 使用嵌套的标签来表示数据层次结构,可以包含属性。
解析速度:XML 解析通常比 JSON 慢,因为 XML 的解析需要处理更多的标记和属性。
与语言无关:XML 是完全与语言无关的,适用于任何编程环境。
文件大小:XML 文件通常比 JSON 大,因为 XML 使用更多的字符和标记。
可扩展性:XML 可以通过 DTD 或 Schema 进行模式验证,提供数据类型的约束和结构的定义。
使用场景
JSON 更适合 Web 应用程序之间的数据交换,尤其是在 JavaScript 环境中,因为其解析效率高,数据格式紧凑。
XML 则更多地用于配置文件、文档存储、跨平台数据交换和需要复杂结构定义的场景。
总结
JSON 和 XML 各有优势,选择哪种格式取决于具体的应用需求。如果需要在 Web 应用中快速传输数据,JSON 是更好的选择;如果需要高度结构化的数据格式和跨语言的兼容性,XML 可能更适合。
Json 序列化和反序列化的含义
JSON 序列化
JSON 序列化是指将复杂数据结构(如对象、数组、集合等)转换为 JSON 格式的字符串的过程。这个过程通常发生在数据需要在网络上传输或存储到文件中时。序列化后的 JSON 字符串可以被任何能够理解 JSON 格式的系统读取和解析。
目的
数据传输:当数据需要在网络上传输时,将其序列化为 JSON 字符串可以方便地通过 HTTP 协议发送。
数据存储:将数据序列化为 JSON 字符串可以方便地存储在数据库、文件或其他存储介质中。
数据交换:JSON 是一种广泛接受的数据交换格式,序列化为 JSON 可以使数据在不同的系统和平台之间共享。
JSON 反序列化
JSON 反序列化则是序列化的逆过程,即将 JSON 格式的字符串转换回原始的数据结构(如对象、数组等)。这个过程通常发生在接收到 JSON 数据并需要在应用程序中使用这些数据时。
目的
数据使用:反序列化后的数据可以被应用程序直接使用,例如填充到对象中以便进一步处理。
状态恢复:从持久存储中读取 JSON 数据并恢复应用程序状态。
数据解析:将 JSON 数据转换为可以被编程语言处理的数据类型。
JSON 和 JS 对象互转
在 JavaScript 中,JSON(JavaScript Object Notation)与 JS 对象之间的转换是通过内置的 JSON 对象的两个方法完成的:JSON.parse()用于解析 JSON 字符串并转换为 JS 对象,而 JSON.stringify()用于将 JS 对象转换为 JSON 字符串。
1. JSON 字符串转换为 JavaScript 对象 -JSON.parse()
JSON.parse()方法用于将 JSON 字符串转换为 JavaScript 对象。它接受一个 JSON 格式的字符串作为参数,并返回一个对应的 JavaScript 对象。
语法:
const obj = JSON.parse(jsonString);
示例:
const jsonString = '{"name":"John","age":30,"city":"New York"}';
const myObj = JSON.parse(jsonString);
console.log(myObj); // 输出: {name: 'John', age: 30, city: 'New York'}
2. 将 JavaScript 对象转换为 JSON 字符串 -JSON.stringify()
JSON.stringify()方法用于将 JavaScript 对象转换为 JSON 字符串。它接受一个 JavaScript 对象作为参数,并返回一个 JSON 格式的字符串。
语法:
const jsonString = JSON.stringify(obj);
示例:
const myObj = {name: "John", age: 30, city: "New York"};
const jsonString = JSON.stringify(myObj);
console.log(jsonString); // 输出: '{"name":"John","age":30,"city":"New York"}'
附加选项
JSON.stringify()还接受两个可选参数:replacer 和 space。
replacer:一个函数或数组,用于指定哪些属性应该被包含在 JSON 字符串中,或者修改属性的值。
space:用于控制输出的缩进空格数量,使 JSON 字符串更易读。
示例:
const myObj = {name: "John", age: 30, city: "New York"};
const jsonString = JSON.stringify(myObj, null, 2);
console.log(jsonString);
// 输出:
// {
// "name": "John",
// "age": 30,
// "city": "New York"
// }
注意事项
当使用 JSON.stringify()时,函数不能被序列化,只有对象的属性会被转换。
如果对象中包含循环引用,JSON.stringify()会抛出错误。
JSON.parse()可以接受第二个参数 reviver,这是一个函数,用于在解析过程中修改结果对象的属性。
这些方法是 JavaScript 中处理 JSON 数据的核心工具,对于前端与后端之间的数据交换尤其重要。
JSON 和 Java 对象互转
在 Java 中,JSON 与 Java 对象之间的转换通常需要借助第三方库,因为 Java 标准库并不直接支持 JSON 的解析和生成。常用的库有 Jackson、Gson、org.json(由 JSON 的发明者 Douglas Crockford 创建)、Fastjson 等。这里我将分别介绍使用 Jackson 进行 JSON 与 Java 对象的互转。
1. 添加依赖
如果你使用 Maven,可以在 pom.xml 中添加以下依赖:
com.fasterxml.jackson.core
jackson-databind
2.15.2
2. JSON 转 Java 对象 -readValue
这个方法将 JSON 字符串转换为 Java 对象。如果在反序列化过程中遇到问题,它会抛出 IOException。
import com.fasterxml.jackson.databind.ObjectMapper;
public class User {
private String name;
private int age;
// Getters and setters...
}
public class Main {public static void main(String[] args) throws Exception {String json = "{"name":"John","age":30}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user.getName()); // 输出: John
}
}
3. Java 对象转 JSON-writeValueAsString
这个方法接受一个 Java 对象作为参数,并返回该对象的 JSON 字符串表示。如果在序列化过程中遇到问题,它会抛出 JsonProcessingException。
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {User user = new User("John", 30);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json); // 输出: {"name":"John","age":30}
}
}
JSON 和 C# 对象互转
在 C#中,JSON 与 C# 对象之间的转换可以通过多种库来实现,其中最流行的是 Newtonsoft.Json, 它提供了强大的功能和良好的性能。此外,.NET Core 和 .NET 5+ 中引入了新的 System.Text.Json 库,它提供了更快的序列化和反序列化性能,但功能上可能不如 Newtonsoft.Json 全面, 下面使用 Newtonsoft.Json 举例。
DeserializeObject 和 SerializeObject 是 Json.NET 库中用于 JSON 序列化和反序列化的方法。Json.NET(也称为 Newtonsoft.Json)是一个流行的.NET JSON 框架,它提供了强大的功能来处理 JSON 数据。
1. 安装 NuGet 包
在 Visual Studio 中,你可以通过 NuGet 包管理器安装 Newtonsoft.Json 包。
2. JSON 转 C# 对象 - JsonConvert.DeserializeObject
DeserializeObject 方法用于将 JSON 字符串转换回.NET 对象。它同样在 JsonConvert 类中定义,可以将 JSON 字符串反序列化为相应的.NET 对象。
using Newtonsoft.Json;
public class User
{public string Name { get; set;}
public int Age {get; set;}
}
public class Program
{public static void Main()
{string json = "{"Name":"John","Age":30}";
User user = JsonConvert.DeserializeObject(json);
Console.WriteLine(user.Name); // 输出: John
}
}
3. C# 对象转 JSON-JsonConvert.SerializeObject
SerializeObject 方法用于将.NET 对象转换为 JSON 字符串。它在 JsonConvert 类中定义,可以将任何实现了 ISerializable 接口或有公共属性的对象序列化为 JSON 格式。
using Newtonsoft.Json;
public class Program
{public static void Main()
{User user = new User { Name = "John", Age = 30};
string json = JsonConvert.SerializeObject(user);
Console.WriteLine(json); // 输出: {"Name":"John","Age":30}
}
}
注意事项
SerializeObject 和 DeserializeObject 方法可以处理复杂的对象图,包括嵌套的对象和数组。
这些方法可以自动处理循环引用,但默认情况下会抛出异常。你可以通过设置 JsonSerializerSettings 来自定义序列化行为,比如允许循环引用。
Json.NET 还提供了其他高级功能,如自定义序列化和反序列化行为、日期格式化、忽略某些属性等。
在使用 Json.NET 时,确保你已经通过 NuGet 包管理器安装了 Newtonsoft.Json 包。这是通过 JsonConvert 类来调用 SerializeObject 和 DeserializeObject 方法的基础。
Json 转义的概念和目的
JSON 转义的概念主要为了确保 JSON 数据的正确性和兼容性,特别是在 JSON 字符串中包含特殊字符时。转义机制允许这些特殊字符被安全地包含在 JSON 文本中,而不改变其原本的语义或引起语法错误。
转义的目的
保留特殊字符:JSON 字符串中的一些字符,如双引号 (“) 和反斜杠(),在 JSON 语法中具有特殊意义。如果不进行转义,它们可能会被误认为是字符串的结束或其它语法元素。例如,双引号用于包围字符串和键名,所以字符串中的双引号需要被转义为 ”。
兼容性:转义字符保证了 JSON 数据在各种环境中(如 HTML、XML、脚本语言等)的正确解析。例如,在 HTML 中具有特殊意义,如果出现在 JSON 字符串中并且不进行转义,可能会导致 HTML 解析错误。
国际化和编码:转义机制允许 JSON 字符串包含任何 Unicode 字符,包括那些无法在 ASCII 编码中表示的字符。例如,非英语字符和表情符号可以通过 uXXXX 的形式表示,其中 XXXX 是该字符的十六进制 Unicode 编码。
JSON 中的转义字符
JSON 中常见的转义字符包括:
b – 退格符
t – 水平制表符
n – 新行
f – 换页
r – 回车
” – 双引号
– 反斜杠
示例
如果一个字符串包含双引号和新行,它在 JSON 中应该被表示为:
{"message": "Hello"world"nThis is a test."}
在 JSON 字符串中,上述双引号和新行都会被正确转义,从而确保 JSON 数据的完整性和正确性。
总的来说,JSON 转义是保证数据在传输和存储过程中完整性、准确性和跨平台兼容性的关键机制。
JSON 的限制
JSON 不支持注释,这可能会影响配置文件的可读性。
JSON 的键名必须是字符串,这与某些语言的动态特性不符。
JSON 不支持日期类型,通常需要转换为字符串表示。
Json 常用工具:可解析,压缩转义格式化等
JSON 在线解析及格式化验证 – JSON.cn
原文地址: json 详解