Datadog Tracing API需要序列化为 JSON 数字的 64 位整数。
{
"span_id": 16956440953342013954,
"trace_id": 13756071592735822010
}
如何使用 JavaScript 创建具有 64 位整数的 JSON?
最佳答案
这实际上比看起来要困难得多。
在 JavaScript 中表示大整数可以使用 BigInt
数据类型(通过给数字加上后缀 n
),此时得到相当广泛的支持。
这将使您的对象看起来像这样:
const o = {
span_id: 16956440953342013954n,
trace_id: 13756071592735822010n
};
问题出现在 JSON 序列化中,因为目前不支持
BigInt
的序列化。对象。当涉及到 JSON 序列化时,您的自定义选项非常有限:replacer
可与 JSON.stringify()
一起使用的函数将允许您自定义 BigInt
的序列化行为对象,但不允许您将它们序列化为原始(未引用)字符串。 toJSON()
BigInt
上的方法原型(prototype)也不会工作。 JSON.stringify()
似乎不会在内部递归调用自身,解决方案涉及将其包装在 proxy 中也行不通。 所以我能找到的唯一选择是(至少部分地)实现你自己的 JSON 序列化机制。
这是一个非常穷人的实现,它调用
toString()
对于 BigInt
类型的对象属性, 并委托(delegate)给 JSON.stringify()
否则:const o = {
"span_id": 16956440953342013954n,
"trace_id": 13756071592735822010n
};
const stringify = (o) => '{'
+ Object.entries(o).reduce((a, [k, v]) => ([
...a,
`"${k}": ${typeof v === 'bigint' ? v.toString() : JSON.stringify(v)}`
])).join(', ')
+ '}';
console.log(stringify(o));
请注意,上述方法在许多情况下无法正常工作,最突出的是嵌套对象和数组。如果我要在实际使用中这样做,我可能会以 Douglas Crockford's JSON implementation 为基础。 .在 this line 周围添加一个额外的案例就足够了。 :
case "bigint":
return value.toString();
关于javascript - 如何在 JavaScript 中序列化 64 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60842629/