javascript - 如何在 JavaScript 中序列化 64 位整数?

标签 javascript json integer

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/

    相关文章:

    json - R + fromJSON - 如何发送标题信息?

    python - 元组与整数的比较

    c - 使用 fputs() 将整数写入文件

    javascript - 如何在运行时在 javascript 中创建对象的多个实例?

    javascript - 将 Google Slide 作为 PDF 附加,并在通过电子邮件发送时替换占位符文本

    Javascript - 调用外部函数作为对象的属性

    javascript - 如何使用 AngularJS 通过 google feed API 获取混合格式

    mysql - 如何创建模拟我的 mysql 数据库的 Elasticsearch 索引

    objective-c - 将 string 转换为 int 会更改值

    javascript - JS on SVG--获取元素的innerHTML