javascript - 对于 Javascript 应用程序,比普通 JSON 更丰富的数据序列化?

标签 javascript node.js json serialization

JSON 可以很好地处理简单的事情,但有时我的数据的类型比 JSON 可以处理的多。比如:Sets, UUIDs, Symbols, Dates, byte arrays等需要手动转换吗那些进出 JSON,或者是否有一个库或标准的方式来做这件事?

我正在使用服务器上的 Node.js 和浏览器中发送和接收数据的相当数量的 Javascript/Typescript 构建一个网络应用程序。

最佳答案

正如我在评论中提到的,我不知道有任何库可以开箱即用。

但是一个简单的编码/解码来自动完成这个是很容易做到的,下面我基本上用一些简单的类型信息标记对象键,例如。 “Date”、“Sym”、“Str”等。当然这还不完整,您可以根据需要扩展任意多种类型,但希望这将是一个起点。

此外,进行深度序列化也应该很简单,为了简单起见,我在这里将其保持平坦。但是,如果您确实需要嵌套序列化,并且需要帮助,请告诉我们。

const symbol1 = Symbol("symbol1");

//for symbols were going to need a lookup
//using a named symbol here would be best
//but remember Symbol("1") === Symbol("1") is false
const symLookup = {
  [symbol1.toString()] : symbol1
};

function encode(src) {
  return JSON.stringify(Object.entries(src).reduce(
    (a, [k, v]) => {
      if (v instanceof Date) {
        k = 'Date_' + k;
        v = v.getTime();
      } else if (v instanceof Set) {
        k = 'Set_' + k;
        v = Array.from(v);
      } else if (typeof v === 'string') {
        k = 'Str_' + k;
      } else if (typeof v === 'symbol') {
        k = 'Sym_' + k;
        v = v.toString()
      } else throw new Error("Not yet implemented");
      a[k] = v;
      return a;
    }, {}));
}

function decode(src) {
  const o = JSON.parse(src);
  const reS = /^(.+)_(.+)$/;
  return Object.entries(o).reduce(
    (a, [k, v]) => {
      const [, tp, k2] = reS.exec(k);
      if (tp === 'Date') v = new Date(v);
      else if (tp === 'Set') v = new Set(v);
      else if (tp === 'Sym') v = symLookup[v];
      a[k2] = v;
      return a;
    }, {});
}


const data = {
  theDate: new Date(),
  aSet: new Set([1,2,3]),
  justAString: "Hello there",
  sym: symbol1
}

console.log('src data = '); console.log(data);
var encoded = encode(data);
console.log('encoded data = '); console.log(encoded);
var decoded = decode(encoded);
console.log('decoded data = '); console.log(decoded);
<p>Look in browsers console to see results..</p>

关于javascript - 对于 Javascript 应用程序,比普通 JSON 更丰富的数据序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55901520/

相关文章:

javascript - 这个onclick(onclick ="this.name=' abc'")是什么意思?

node.js - 从 Cloudinary URL 中提取公共(public) ID

node.js - 不和谐机器人 : Call a user by name?

javascript - jQuery Mobile js 仅在刷新页面时才起作用

javascript - IFrame 回发时发生事件?

javascript - 如何使用 jQuery Validate 表单验证与 dropkick 选择元素(基于 DIV 的选择表单元素)

javascript - 在 Canvas 上显示点

javascript - 使用 jQuery ajax 方法的简单expressjs PUT 处理程序

java - 如何使用 ObjectMapper 将 JSON 值视为 Java 中的字符串对象?

python - 从 Python 到 Azure 的 REST API 调用问题