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

对于Javascript应用程序,数据序列化比普通JSON更丰富?,javascript,node.js,json,serialization,Javascript,Node.js,Json,Serialization,JSON可以很好地处理简单的事情,但有时我的数据的类型比JSON能够处理的更多。例如:设置、uuid、符号、日期、字节数组等。我是否需要手动将它们转换为JSON或从JSON转换为JSON,或者是否有库或标准的转换方法 我正在构建一个web应用程序,在服务器上使用Node.js,在浏览器中使用大量Javascript/Typescript发送和接收数据。正如我在评论中提到的那样,我不知道有任何库可以直接实现这一点 但是一个简单的自动编码/解码是很容易做到的,下面我基本上用一些简单的类型信息来标记对

JSON可以很好地处理简单的事情,但有时我的数据的类型比JSON能够处理的更多。例如:
设置
uuid
符号
日期
、字节数组等。我是否需要手动将它们转换为JSON或从JSON转换为JSON,或者是否有库或标准的转换方法


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

正如我在评论中提到的那样,我不知道有任何库可以直接实现这一点

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

此外,它应该是简单的,使这做深入序列化,我一直在这里保持它的单位,使事情简单。但如果您确实需要嵌套序列化,并且需要帮助,请告诉我们

const symbol1=Symbol(“symbol1”);
//因为符号需要查找
//在这里使用命名符号将是最好的
//但请记住,符号(“1”)==符号(“1”)是假的
常量符号查找={
[symbol1.toString()]:symbol1
};
函数编码(src){
返回JSON.stringify(Object.entries(src).reduce(
(a,[k,v])=>{
if(v instanceof Date){
k='日期uu'+k;
v=v.getTime();
}else if(v instanceof Set){
k=‘Set_u’+k;
v=数组。从(v)开始;
}else if(typeof v=='string'){
k='Str_uu'+k;
}else if(v的类型=='symbol'){
k='Sym_u'+k;
v=v.toString()
}否则抛出新错误(“尚未实现”);
a[k]=v;
返回a;
}, {}));
}
函数解码(src){
const o=JSON.parse(src);
常数reS=/^(+.+)(+)$/;
返回Object.entries(o).reduce(
(a,[k,v])=>{
常数[,tp,k2]=reS.exec(k);
如果(tp==‘日期’)v=新日期(v);
如果(tp===‘设置’)v=新设置(v),则为else;
如果(tp=='Sym')v=symLookup[v];
a[k2]=v;
返回a;
}, {});
}
常数数据={
日期:新日期(),
aSet:新集合([1,2,3]),
贾斯特林:“你好”,
sym:symbol1
}
log('src data=');控制台日志(数据);
var编码=编码(数据);
log('encoded data=');console.log(编码);
var解码=解码(编码);
log('decoded data=');控制台日志(已解码)

在浏览器控制台中查看结果。

不太可能,您所做的几乎是正确的方法。还有其他的序列化lib,但一般来说,对于速度和大小的优化还有更多。我在想谷歌在这里的原型。但是应该可以自动序列化并将您刚才提到的类型转换为JSON,。一个选项是使用标记信息(最简单的选项),另一个选项是使用某种形式的模式。然后,您可以只使用两个函数(可能称为encode/decode)来从键入的序列化格式转换为。此外,符号可能很棘手,因为它们是唯一的。