盘点常见的JSON用法

iOS开发
• 阅读 1288

JSON 是什么?

JSON 是一种语法,可以用来序列化对象、数组或者数字等数据类型。换句话说,我们可以利用 JSON 来将数据转成字符串的形式。

常见的 API

JSON.parse

  • 功能

    还原被序列化的数据(反序列化),即将字符串还原为它本来的数据结构。

  • 参数

    • text,即将要被「反序列化」的字符串
    • reviver,处理字符串的回调函数,可以参与到「反序列化」的过程,遍历顺序是由内到外

JSON.stringify

  • 功能

    序列化一个值,即将一个值转为字符串的形式。

  • 参数

    • value,将要被序列化的值
    • replacer

      1. 如果该值是函数,那么它会参与到序列化的过程当中
      2. 如果该值是数组,那么只有包含在数组里的属性才会被序列化
      3. 如果该值是 null 或者 undefined,那么所有属性都会被序列化

使用场景

本地缓存

经常使用的本地缓存如 localStorage,对于存入的数据是有要求的:键名和值都只能是 string 类型。
而这时 JSON 就可以派上用场了?

  • 存储

    localStorage.set(key, JSON.stringify(data))
  • 提取

    localStorage.getItem(key, JSON.parse(str))

处理 Date 对象

如果对象里有 Date 对象,那么序列化之后结果是这样的?

"2020-07-29T14:47:09.608Z"

这时候就头疼了,我们需要再写一个函数来处理反序列化之后的结果吗?
盘点常见的JSON用法

别忘了上面提到的参数,无论是 parse 还是 stringify 都允许传入一个参数来控制序列化/反序列化,因此我们可以这样来处理 Date 的对象?

let obj = {
    text: 'just do it',
    date: new Date()
}
let str = JSON.stringify(obj)
let org = JSON.parse(str, (key, val) => {
    // 如果是 date 就转成 Date
    if (key === 'date') {
        return new Date(val)
    }
    return val
})

处理 RegExp 对象

现在场景更加复杂了,你需要处理 RegExp 对象了,这时候要怎么做呢?手快的同学可能就直接开动了?

let obj = {
    reg: /\d+/
}
let str = JSON.stringify(obj)
let org = JSON.parse(str)

实际上,直接序列化一个 RegExp 对象只会返回一个 "{}"(不信你试试)
盘点常见的JSON用法

别忘了,RegExp 构造函数可以传入这两个参数:

  • source
  • flags

因此我们只要对包含 RegExp 对象的属性在序列化与反序列化时做特别处理即可?

// 序列化 RegExp 对象
let obj = { reg: /\d+/ }
let str = JSON.stringify(obj, (key, val) => {
    if (key === 'reg') {
        return {
            source: val.source,
            flags: val.flags
        }
    }
    return val
})
// 反序列化
let org = JSON.stringify(str, (key, val) => {
    if (key === 'reg') {
        return new RegExp(val.source, val.flags)
    }
    return val
})

判断对象是否为空

我们也可以利用 JSON.stringify 来判断某个对象是否为空(没有任何属性)?

const isObjectEmpty = (obj) => {
    return JSON.stringify(obj) === '{}' && !obj.__proto__
}

总结

盘点常见的JSON用法

点赞
收藏
评论区
推荐文章
Bill78 Bill78
4年前
Python中JSON的基本使用_Just do it !
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。Python3中可以使用json模块来对JSON数据进行编解码,它主要提供了四个方法:dumps、dump、loads、load。dump和dumpsdump和dumps对python对象进行序列化。将一个Python对象
Stella981 Stella981
3年前
C# JToken类的使用,实现解析动态json数据、遍历、查找
在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用。为了解决动态解析json数据,微软有个Newtonsoft.Json封装类十分好用,里面的JToken直接实现ling查询。将json字符串解析为JToken,
Wesley13 Wesley13
3年前
GSON搞定任何JSON数据
Gson介绍:GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。特点:a、快速、高效    b、代码量少、简洁c、面向对象d、数据传递和解析方便Gson的p
Stella981 Stella981
3年前
Gson自定义处理Calendar日期Date时间类型
Gson是什么?Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个JSON字符串转成一个Java对象,或者反过来。Gson对一般类型的序列化和反序列话都没有问题,但是像Calendar日期这样的类型,可能需要手动处理下            遇到的问题?时间
Stella981 Stella981
3年前
Ajax和SpringMVC之间JSON交互
Ajax和SpringMVC之间的json数据传输有两种方式:1.直接传输Json对象2.将Json序列化成json字符串1.直接传输Json对象前端Ajax$(document).ready(function(){$("btn_login").click(function(){
Stella981 Stella981
3年前
Django 前台通过json 取出后台数据
前台通过json取出后台数据步骤1:后台数据通过JSON序列化成字符串注意:1、json是1个字符串     2、通过json.dumps('xxx')序列化成1个字符串的 '字典对象' views.pydefajax(request):ifrequest.
Wesley13 Wesley13
3年前
Go 中 JSON 的序列化和反序列化
golang中对json的序列化/反序列化操作还是比较容易的,序列化操作主要是通过encoding/json包的Marshal()方法来实现,反序列化操作主要是通过encoding/json包的Unmarshal()方法来实现.//JSON序列化和反序列化//可用在api序列化输出//转成
Stella981 Stella981
3年前
Python基础编程常用模块汇总
3.8<fontcolorredjson模块重点</fontjson模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表\1,2,3\利用json转化成特殊的字符串,然后在编码成bytes
Stella981 Stella981
3年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
MYSQL中JSON类型介绍 | 京东物流技术团队
在mysql未支持json数据类型时,我们通常使用varchar、blob或text的数据类型存储json字符串,对mysql来说,用户插入的数据只是序列化后的一个普通的字符串,不会对JSON文档本身的语法合法性做检查,文档的合法性需要用户自己保证。在使用时需要先将整个json对象从数据库读取出来,在内存中完成解析及相应的计算处理,这种方式增加了数据库的网络开销并降低处理效率。