JSON适用于简单的事情,但有时我的数据具有比JSON无法处理的更多类型。例如:Sets
,UUIDs
,Symbols
,Dates
,字节数组等。我是否需要手动将它们与JSON相互转换,或者是否有库或这样做的标准方法?
我正在用Node.js在服务器上构建一个Web应用程序,并在浏览器中使用大量Javascript / Typescript发送和接收数据。
答案 0 :(得分:1)
正如我在评论中提到的那样,我不知道有任何库可以做到这一点。
但是一个简单的自动编码/解码就很容易做到,下面我基本上用一些简单的类型信息来标记对象键。 “ 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>