js 对象 / json / jsonb / jsonp 区别

一、JSON vs JS 对象


1、区别

区别 Javascript 对象 Json
含义 对象的实例 一种数据格式(序列化格式)
传输 不能传输 可以跨平台传输,轻量级
格式 1.键不加引号、加单引号、双引号都行
2.值可以是函数、对象、字符串、数字、boolean 等
1. 键必须得加双引号
2. 值不能为函数/undefined/NaN

注:序列化格式:早期有 XML,后来基于 javascript 诞生了更轻量的 JSON,再后来还有YAML。

针对于科学使用的大量数据集合,例如气候,海洋模型和卫星数据,开发了特定的二进制序列化标准,例如HDF,netCDF和较旧的GRIB。

2、序列化

(1)序列化操作
  • 正序列化 - JSON.stringify()

  • 反序列化 - JSON.parse()、(不推荐)eval()

// 初始化 JS 对象
var obj_origin = {
    a: 1,
    b: "2",
    'c': 3
}
console.log(obj_origin) // { a: 1, b: '2', c: 3 }

// 正序列化
var objStr = JSON.stringify(obj_origin)
console.log(objStr) // {"a":1,"b":"2","c":3}

// 反序列化 
var obj = JSON.parse(objStr)
console.log(obj) // { a: 1, b: '2', c: 3 }

var obj2 = eval("(" + objStr + ")")
console.log(obj2) // { a: 1, b: '2', c: 3 }
(2)eval()

首先,eval() 的功能,是可将一个 JS表达式 求值成特定的对象,所以把字符串解析成 JS 对象只不过是作用之一。

问题一:为什么 eval() 解析时左右要加括号?

答:

1、js 对象是以 ”{}” 的方式开始和结束的,但在 js 中,它会被误当成一个语句块(statement) 来处理。

2、所以加上圆括号,是为了把这个字符串变为表达式,而不是语句来执行。

alert(eval("{}")); // return undefined

alert(eval("({})"));// return object[Object]

问题二:为什么不推荐用 eval() 呢?

答:

虽然 eval 的解析能力是强于 JSON.parse 的,它可以解析不规范的 JSON 字符串,但是上面 问题一 的例子也可以看出,eval 是不安全的,特别是数据是第三方给予的时候。所以还是推荐用 JSON.parse (其实JSON.parse 底层也是调用的eval )。

二、JSON vs JSONB


详看我之前的一篇博文: Postgres 的 JSON / JSONB 类型

三、JSON vs JSONP


详看我之前的一篇博文:AJAX实现跨域的三种方法

猜你喜欢

转载自www.cnblogs.com/xjnotxj/p/12006499.html