npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

safe-json-type

v1.3.5

Published

将json中不支持的Date和Bytes(Buffer)用安全的方法序列化,并在反序列化后找回对应的类型(而不是字符串)

Downloads

148

Readme

safe-json-type

🏠 主页

https://github.com/CaoMeiYouRen/safe-json-type#readme

将 json 中不支持的 Date 和 Bytes(Buffer)用安全的方法序列化,并在反序列化后找回对应的类型(而不是字符串)

json 字段支持以下类型:

  • String 字符串
  • Number 数字
  • Boolean 布尔类型
  • Array 数组
  • Object 对象
  • Date 日期
  • Bytes (Buffer)base64 编码的二进制数据【浏览器端默认不支持,但在模块化构建中支持】
  • Null 空值

📦 依赖要求

  • node >=16

🚀 安装

npm i safe-json-type -S

👨‍💻 使用

序列化为字符串: SafeJsonType.stringify(obj)

 let obj = {
     num: 1024,
     str: 'hello world 你好世界',
     bool: true,
     undef: undefined,
     nil: null,
     Num: new Number(-2048),
     Str: new String('ok'),
     Bool: new Boolean(false),
     date: new Date('2019-01-01T00:00:00Z'),
     buff: Buffer.from('123456'),
     arr: [
         new Date('2019-01-01T00:00:00Z'),
         Buffer.from('123456'),
     ],
     obj: {
         num: 1024,
         str: 'hello world 你好世界',
         bool: true,
         date: new Date('2019-01-01T00:00:00Z'),
         buff: Buffer.from('123456'),
     }
 }
 let str = SafeJsonType.stringify(obj)
 console.log(str);
 /*
{
    "num": 1024,
    "str": "hello world 你好世界",
    "bool": true,
    "nil": null,
    "Num": -2048,
    "Str": "ok",
    "Bool": false,
    "date": {
        "__type": "Date",
        "iso": "2019-01-01T00:00:00.000Z"
    },
    "buff": {
        "__type": "Bytes",
        "base64": "MTIzNDU2"
    },
    "arr": [
        {
            "__type": "Date",
            "iso": "2019-01-01T00:00:00.000Z"
        },
        {
            "__type": "Bytes",
            "base64": "MTIzNDU2"
        }
    ],
    "obj": {
        "num": 1024,
        "str": "hello world 你好世界",
        "bool": true,
        "date": {
            "__type": "Date",
            "iso": "2019-01-01T00:00:00.000Z"
        },
        "buff": {
            "__type": "Bytes",
            "base64": "MTIzNDU2"
        }
    }
}
 
 */

反序列化为对象SafeJsonType.parse(str)

let str = '{"num":1024,"str":"hello world 你好世界","bool":true,"nil":null,"Num":-2048,"Str":"ok","Bool":false,"date":{"__type":"Date","iso":"2019-01-01T00:00:00.000Z"},"buff":{"__type":"Bytes","base64":"MTIzNDU2"},"arr":[{"__type":"Date","iso":"2019-01-01T00:00:00.000Z"},{"__type":"Bytes","base64":"MTIzNDU2"}],"obj":{"num":1024,"str":"hello world 你好世界","bool":true,"date":{"__type":"Date","iso":"2019-01-01T00:00:00.000Z"},"buff":{"__type":"Bytes","base64":"MTIzNDU2"}}}';
let obj = SafeJsonType.parse(str);
console.log(obj);
/*
{ num: 1024,
  str: 'hello world 你好世界',
  bool: true,
  nil: null,
  Num: -2048,
  Str: 'ok',
  Bool: false,
  date: 2019-01-01T00:00:00.000Z,
  buff: <Buffer 31 32 33 34 35 36>,
  arr: [ 2019-01-01T00:00:00.000Z, <Buffer 31 32 33 34 35 36> ],
  obj:
   { num: 1024,
     str: 'hello world 你好世界',
     bool: true,
     date: 2019-01-01T00:00:00.000Z,
     buff: <Buffer 31 32 33 34 35 36> 
   }
 }
*/

插件化

目前自带依赖的插件safe-json-type-plugins

如果后续有其他人想要开发新的插件,可以参考一下。命名上建议以 safe-json-type-plugin-xxxx 的格式,其中 xxxx 就是指定的格式。

新版本中支持通过插件来对 Date、Buffer 之外的数据类型进行序列化和反序列化

例如 Date 的插件如下,只需要实现 SafeJsonPlugin 接口即可,最后再调用 SafeJsonType.use(new SafeJsonPluginDate())即可

import { SafeJsonPlugin, SafeJson } from 'safe-json-type-plugins'

export class SafeJsonDate implements SafeJson {
    __type: 'Date'
    iso: string
}
/**
 * Date类 转换插件
 *
 * @author CaoMeiYouRen
 * @date 2020-02-13
 * @export
 * @class SafeJsonPluginDate
 * @implements {SafeJsonPlugin<Date>}
 */
export class SafeJsonPluginDate implements SafeJsonPlugin<SafeJsonDate, Date> {
    readonly type = 'Date'
    condition(obj: any): boolean {
        return obj instanceof Date
    }
    serialize(obj: Date): SafeJsonDate {
        return {
            __type: 'Date',
            iso: obj.toISOString()
        }
    }
    deserialize(obj: SafeJsonDate): Date | SafeJsonDate {
        if (obj.iso) {
            return new Date(obj.iso)
        }
        return obj
    }
}

注意事项

  1. 由于在序列化时使用了__type作为关键字来标记类型,因此不建议在对象中使用__type字段。如果有使用将会有警告【但不会报错】。
let obj = {
    __type: 'MyType',
    value: 'my_value'
}
let str = SafeJsonType.stringify(obj);
//(safe-json-type) [warning] "__type" is a reserved field. Do not use it unless necessary
  1. 本项目没有使用 node 专属模块,所以也可以在浏览器运行。压缩后的文件见 dist/browser.min.js。出于包大小考虑移除了所有非原生依赖,因此当直接通过 script 引用 browser.min.js 时不支持 buffer 对象,如有需要可在模块化构建中使用。

    直接通过引用 browser.min.js 时使用SafeJsonType.SafeJsonType.stringify(obj)来调用【前一个 SafeJsonType 是命名空间,后一个是类名,日后可能会在同一个命名空间下导出多个类】

    如果是现代浏览器也可以使用 browser.esm.min.js 版本,更为友好

🛠️ 开发

npm run dev

🔧 编译

npm run build

🔍 Lint

npm run lint

💾 Commit

npm run commit

👤 作者

CaoMeiYouRen

🤝 贡献

欢迎 贡献、提问或提出新功能!如有问题请查看 issues page. 贡献或提出新功能可以查看contributing guide.

💰 支持

如果觉得这个项目有用的话请给一颗⭐️,非常感谢

后记

本项目参考了https://leancloud.cn的序列化和反序列化方案,在此表示感谢。

关于本项目的开发原因。因为在日常开发中经常会遇到 Date 格式的数据传输,而 json 中又不可能直接传输 Date,因此会被格式化成字符串。无论前端还是后端,拿到这个数据都需要对 Date 的字段再做一次转换才行。而本项目则是省去了这一步。

在开写之前,因为已经有 leancloud 这样的项目在前了,所以估计 npm 上也有类似的包,但暂时没找到,就干脆自己写了。

另外,也是搜索过其他关于 json 传输相关的包,例如 serialize-javascript。但这玩意儿有个问题,那就是序列化出来的东西都不符合 json 规范了,若后端采用其他语言编写,例如 java,那么对这个数据处理显然是很麻烦的。而本人这个包,序列化后依旧符合 json 规范,后端采用其他语言编写也可以用同样的方法解析。

对于其他数据类型,例如 Map、Set、RegExp 也在考虑中,不过必要性没那么大,以后有空会考虑在之后的版本中加入支持。【目前建议通过编写插件的方式来实现】

📝 License

Copyright © 2024 CaoMeiYouRen. This project is MIT licensed.


This README was generated with ❤️ by cmyr-template-cli