JSON详解

JSON是什么?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON基于JavaScript的一个子集,但它独立于任何语言,因此可以在多种编程环境中使用,包括但不限于JavaScript、Java、Python等。

JSON的基本结构:

**数据在名称/值对中:**数据以键值对的形式存储,类似于JavaScript中的对象。

**数据由逗号分隔:**每个键值对之间使用逗号分隔。

**花括号保存对象:**使用 {} 来表示一个JSON对象。

**方括号保存数组:**使用 [] 来表示一个JSON数组。

JSON数据结构类型(语法):

对象:由大括号 {} 包围的一系列无序的键值对组成,其中键必须是字符串,而值可以是任意有效的JSON数据类型。

数组:由方括号 [] 包围的一系列值组成,值之间用逗号 , 分隔。

字符串:由双引号 " 包围的零个或多个Unicode字符序列,支持转义字符。

数字:可以是整数或浮点数,支持科学记数法,但不支持无穷大或NaN这样的特殊值。

布尔值:可以是 true 或 false。

null:表示没有值或空值。

简单示例

例如,一个简单的JSON数据可能如下所示:

java 复制代码
{
  "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字符串解析成一个对象,然后像操作普通对象一样访问其属性和方法。

cs 复制代码
//例如,在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对象。

语法:

javascript 复制代码
const obj = JSON.parse(jsonString);

示例:

javascript 复制代码
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格式的字符串。

语法:

javascript 复制代码
const jsonString = JSON.stringify(obj);

示例:

javascript 复制代码
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字符串更易读。

示例:

javascript 复制代码
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中添加以下依赖:

XML 复制代码
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.15.2</version>
</dependency>

2. JSON转Java对象-readValue

这个方法将JSON字符串转换为Java对象。如果在反序列化过程中遇到问题,它会抛出IOException。

java 复制代码
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。

java 复制代码
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对象。

cs 复制代码
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<User>(json);
        Console.WriteLine(user.Name); // 输出: John
    }
}

3. C#对象转JSON-JsonConvert.SerializeObject

SerializeObject方法用于将.NET对象转换为JSON字符串。它在JsonConvert类中定义,可以将任何实现了ISerializable接口或有公共属性的对象序列化为JSON格式。

cs 复制代码
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中应该被表示为:

cs 复制代码
{
  "message": "Hello \"world\"\nThis is a test."
}

在JSON字符串中,上述双引号和新行都会被正确转义,从而确保JSON数据的完整性和正确性。

总的来说,JSON转义是保证数据在传输和存储过程中完整性、准确性和跨平台兼容性的关键机制。

JSON的限制

JSON不支持注释,这可能会影响配置文件的可读性。

JSON的键名必须是字符串,这与某些语言的动态特性不符。

JSON不支持日期类型,通常需要转换为字符串表示。

Json常用工具:可解析,压缩转义格式化等

JSON在线解析及格式化验证 - JSON.cn

相关推荐
懒大王爱吃狼27 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷1 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
阿伟*rui2 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
待磨的钝刨2 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
△曉風殘月〆3 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
逐·風4 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#