【问题标题】:For Javascript apps, richer data serialization than plain JSON?对于 Javascript 应用程序,比普通 JSON 更丰富的数据序列化?
【发布时间】:2023-03-28 13:57:01
【问题描述】:

JSON 适用于简单的事情,但有时我的数据的类型比 JSON 可以处理的要多。例如:SetsUUIDsSymbolsDates、字节数组等。我是否需要手动将它们与 JSON 进行转换,或者是否有库或标准方法可以做到这一点?

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

【问题讨论】:

  • 并非如此,您所做的几乎是正确的方法。还有其他序列化库,但通常有更多的速度和大小优化。我在想 googles protobuff 这里。但是应该可以自动序列化并转换为您刚才提到的类型的 JSON。一种选择可能是使用标签信息(最简单的选择),另一种选择是使用某种形式的模式。然后,您可以只使用 2 个可能称为编码 / 解码的函数来从类型化的序列化格式转换为 a。符号也可能很棘手,因为它是独一无二的。

标签: javascript node.js json serialization


【解决方案1】:

正如我在 cmets 中提到的,我不知道有任何库可以做到这一点。

但是自动执行此操作的简单编码/解码非常容易,下面我基本上用一些简单的类型信息标记对象键,例如。 “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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2014-11-24
    • 2011-12-02
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多