您的位置:首页 > 科技 > 能源 > JSON详解

JSON详解

2024/9/24 5:21:18 来源:https://blog.csdn.net/weixin_43700867/article/details/140064619  浏览:    关键词:JSON详解

一 JSON定义

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

从他的定义看(中文翻译“JavaScript 对象表示法”),它是一种数据交换的文本格式,而不是一种编程语言。

二  JSON语法

JSON是从JavaScript的对象发展而来,最开始是用来描述JavaScript数据对象的。在JavaScript语言中,一切皆对象,那么JSON 语法是JavaScript对象表示语法的子集。

  • 数据在键/值对中
  • 数据由逗号,分隔
  • 使用斜杆 \ 来转义字符
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组,数组可以包含多个对象

2.1 JSON键/值对

JSON键/值对由键和值组成,键必须是字符串(后面会讲为啥要是字符串),值可以是字符串(string)、数值(number) 、对象(object)、数组(array)、布尔值、 空值。

  • 字符串由双引号包围的任意数量Unicode字符的集合,使用反斜线转义
  • 数值支持整型、浮点型,浮点型也可以用指数表示,JSON中不支持使用八进制或者十六进制,必须使用十进制,且不能是NaN和Infinity
  • 布尔值是true和false
  • 对象和数组后面详细讲解
2.1.1 值的类型
  • 字符串

JSON 字符串是由双引号" "包围的 Unicode 字符序列,使用反斜杠 `` 转义。

举个例子:

{"name": "Apifox","city": "Guangzhou"
}

在这个例子中,字符串"name""city"是由双引号" "包围的。

  • 数字

JSON 数字可以是整数或浮点数。

举个例子:

{"age": 30,"weight": 65.5
}

在这个例子中,数字"30""65.5"分别是整数和浮点数,不需要双引号" "包围。

  • 布尔值

JSON 布尔值只有两个取值:true 和 false。

举个例子:

{"isStudent": true,"isEmployed": false
}

在这个例子中,布尔值"isStudent"的取值为true,布尔值"isEmployed"的取值为false,不需要双引号" "包围。

  • null

JSON 的 null 表示一个空值。

举个例子:

{"middleName": null
}

在这个例子中,"middleName"的值为null,不需要双引号" "包围。

值支持的类型,如果是对象或者数组,两者的值还支持嵌套类型。(见后面示例)

2.2 常见转义字符

  1. 双引号 \":表示一个双引号字符。
  2. 反斜杠 \\:表示一个反斜杠字符。
  3. 换行符 \n:表示一个换行符。
  4. 回车符 \r:表示一个回车符。
  5. 制表符 \t:表示一个制表符。
  6. 退格符 \b:表示一个退格符。
  7. 单引号 \':表示一个单引号字符。
  8. 换页符 \f:表示一个换页符。
示例

以下是一些示例代码,展示了如何在字符串中使用这些转义字符:

public class EscapeCharacterExample {public static void main(String[] args) {// 使用双引号String quote = "He said, \"Hello, World!\"";System.out.println(quote);// 使用反斜杠String path = "C:\\Users\\Username\\Documents";System.out.println(path);// 使用换行符String multiline = "First line\nSecond line";System.out.println(multiline);// 使用制表符String tabbed = "Column1\tColumn2\tColumn3";System.out.println(tabbed);// 使用单引号String singleQuote = "It\'s a beautiful day!";System.out.println(singleQuote);}
}
 输出结果
He said, "Hello, World!"
C:\Users\Username\Documents
First line
Second line
Column1 Column2 Column3
It's a beautiful day!
详细解释
  1. 双引号 \"

    • 在字符串中使用双引号时,需要使用反斜杠进行转义。例如,"He said, \"Hello, World!\"" 表示字符串中包含双引号。
  2. 反斜杠 \\

    • 反斜杠本身是一个转义字符,如果需要在字符串中表示一个反斜杠,需要使用两个反斜杠。例如,"C:\\Users\\Username\\Documents" 表示文件路径中包含反斜杠。
  3. 换行符 \n

    • 换行符用于在字符串中表示换行。例如,"First line\nSecond line" 表示字符串中包含换行。
  4. 制表符 \t

    • 制表符用于在字符串中表示制表符。例如,"Column1\tColumn2\tColumn3" 表示字符串中包含制表符。
  5. 单引号 \'

    • 在字符串中使用单引号时,需要使用反斜杠进行转义。例如,"It\'s a beautiful day!" 表示字符串中包含单引号。

2.3 键名

JSON的键,必须是字符串,必须是字符串,必须是字符串!重要的事情说三遍。为什么要是字符串呢?

其实最开始JSON是JavaScript的对象的表示方式,因此他本质上是一个对象!只是后来人们发现它表示的数据简洁,就发展为替代XML的轻量级的网络传输数据格式。那么就要转成字符串(我们称其为JSON字符串)在网络中传输,客户端如果不是采用JavaScript,而是采用Java、Python、C#、C、C++等语言,那么在解析JSON时,就会遇到下面问题:

  1. 如果键名不采用字符串,就会与其他语言的关键字冲突,比如class等等
  2. 如果键名不采用字符串,对应键名中就含有冒号:的,就会与JSON语法本身冲突。
  3. 如果键名不采用字符串,那么键名如果是数字,就存在类型转换问题

2.4 JSON 的数据结构

JSON 由两种数据结构组成:对象数组

2.4.1 对象类型

对象(object)是由键值对组成的无序集合,键是字符串,值可以是任何类型,包括对象和数组。对象由一对花括号{ }包围,键和值之间用冒号:分隔。键值对之间用逗号,分隔。

示例1: 

例如, 下面我们表示一个学生的对象的信息,有3个属性:name,age,num,score。

{"name": "Tom","age": 10,"num": 1,"score": 90.0
}

 示例2:

{"list" : [ {"name": "Apifox","ID": 2,"city": "Guangzhou"}] 
}

在这个例子中,对象的键是"name""ID""city",对应的值是字符串、数字和字符

示例3:

{"id": 101,"name": "Jane Doe","is_active": true,"roles": ["admin", "editor"],"contact": {"email": "jane.doe@example.com","phone": "123-456-7890"},"preferences": {"notifications": {"email": true,"sms": false}}
}
2.4.2 数组类型

数组(array)是值(value)的有序集合,每个值可以是任何类型,包括对象和数组。数组由一对方括号[ ]包裹,值之间用逗号,分隔。

示例1:

[{"name": "Tom","age": 10,"num": 1,"score": 90},{"name": "Jack","age": 11,"num": 2,"score": 95}
]

 示例2:

[{"name": "Alice","age": 28,"skills": ["JavaScript", "Python"]},{"name": "Bob","age": 34,"skills": ["Java", "C++"]}
]

2.5 JSON 注意事项

  • JSON的字符串必须使用双引号" ",而不能使用单引号' '
  • JSON的值可以是字符串、数字、布尔值、null、对象或数组。
  • JSON的键必须是字符串,必须使用双引号" "
  • JSON的格式必须严格遵守规定,否则可能会导致解析错误。

三 JSONObject和JSONArray

3.1 JSONObject

JSONObject 是根据 JSON 形式在 Java 中存在的对象映射各大 JSON 类库的 JSONObject 内部实现也是不太一样的。

  • 和Map的API相似
  • 对应json的对象类型数据结构

具体用法看源码API(org.json举例)

    private final LinkedHashMap<String, Object> nameValuePairs;/*** Creates a {@code JSONObject} with no name/value mappings.*/public JSONObject() {nameValuePairs = new LinkedHashMap<String, Object>();}

3.2 JSONOArray

存放数据的容器就是一个 List 的类型,默认创建为 ArrayList

  • 和List的API相似
  • 对应json的数组类型数据结构

具体用法看源码API(org.json举例)

    private final List<Object> values;/*** Creates a {@code JSONArray} with no values.*/public JSONArray() {values = new ArrayList<Object>();}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com