背景

目前前后端的数据传递普遍用 JSON,但仍有些后端同学返回的数据格式不标准(此处暂不考虑和后端扯皮强势让其修复的因素),那拿到了这种非标准化的数据格式,前端就手足无措了么,这是不应该的。

如后端返回的一段 JSON 数据结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
newValue:
"{
"auctionMode":"XCP",
"countdownDuration":0,
"createTime":1576810059073,
"customPriceButton":"['200','500','1000','1500','-1']",
"defaultTag":1,
"editedBy":"测试标使用账号",
"editedById":"M6QbTIFJHa",
"id":263,
"modifyTime":1577090688871,
"ruleName":"接口现场拍0秒",
"tenantCode":"01152156"
}"
}


JSON(Javascript Object Notation)

定义:JSON 是一种语法,用来序列化对象、数组、数值、字符串、布尔值、null

JSON.parse()

JSON.parse(text [,reviver])
解析 JSON 字符串,提供可选的 reviver 函数,用以在返回值之前对所得到的对象执行变换操作

注意:

  1. JSON.parse() 不允许用逗号作为结尾
1
2
JSON.parse("[1,2,3,]")
JSON.pasre('{"foo":1,}') // SyntaxError
  1. 如果传入的 JSON 字符串被解析后是对象类型:
    • 对象的 key, value(字符串需要) 必须用 “”(双引号)包裹
    • 整个传入的 JSON 字符串 被 ‘’(单引号)包裹
1
2
3
4
5
6
const json = '{"name": "wuyanbin", "age": 12}'
JSON.parse(json) // {name: 'wuyanbin', age: 12}

// 整个字符串被 "" 双引号包裹
const json = "{'name': 'wuyanbin', 'age': 12}" // Unexpected token ' in JSON at position 1

  1. 如果传入的 JSON 字符串被解析后是数组(也是对象类型):

    • 若数组中的元素类型是 非字符串(不包括对象中的 key, value) 类型,使用 “”(双引号) 或者 ‘’(单引号)都可以
1
2
const json = '[1,2,3]' || "[1,2,3]"
JSON.parse(json) // [1,2,3]
  • 若数组中的元素类型是 字符串 类型,外部必须使用 ‘’(单引号),且元素使用””(双引号)包裹
1
2
const json = '["1","2","3"]'
JSON.parse(json) // ["1","2","3"]

**

总结:

  • JSON 字符串中,若对象里需要使用引号的(对象 key value, 数组 中元素的字符串值)则必须使用双引号,外部必须使用单引号
  • 若 JSON 字符串中对象里不需要使用引号,则外部使用单引号和双引号都可以