【问题标题】:Is there a way to consider JSON arrays unordered in Go?有没有办法考虑在 Go 中无序的 JSON 数组?
【发布时间】:2022-01-10 21:58:06
【问题描述】:

我正在尝试在 Go 中复制 object-hash npm 包,并且需要能够支持 无序数组(即在决定一个 JSON 是否不同于另一个)。

示例:{ foo: 1.23e1, bar: { baz: [0, 1, { a: 1 }, { b: 2 }], abc: 12 } }{ foo: 1.23e1, bar: { baz: [1, 0, { b: 2 }, { a: 1 }], abc: 12 } } 两个 JSON 字符串应该给出相同的输出(字节数组)。

目前,我正在通过a lot of recursive code 实现这一目标,试图涵盖所有边缘情况。有更好的方法吗?

编辑:

  1. 为了进一步阐明问题陈述,我正在尝试生成 JSON 字符串的 SHA-1 哈希。这些 JSON 是任意结构的(因此无法将它们解组为明确定义的 struct)。在生成这些散列时,我的客户希望我忽略数组的顺序 - 因为任何顺序具有相同元素的任何数组都代表其系统中的相同事物(他们使用 JSON 数组作为无序列表)。
  2. 由于我无法对这些输入 JSON 的结构做出任何假设,因此我在对数组进行散列之前对它们进行排序(在我当前的实现中)。对于排序,我正在比较数组元素的 json 编组字符串表示。在排序之前,我还要检查数组的任何元素本身是否是数组或映射,并递归处理它们。 (这就是代码量很大的原因)
  3. Node 中的object-hash implementation 似乎跟我的流程一样。

【问题讨论】:

  • 但是它们是有序的,其他系统会认为它们是有序的,你到底想做什么?如果只是为了比较,为了一致性排序它们看起来不像很多代码。
  • XY 问题?您尝试这样做的最终目标是什么?
  • 您的问题没有很好地说明。您期待复制允许对空接口的切片(使用 go 术语)进行排序的 javascript 实现。 IE:如何将整数与映射字符串 interface{} 进行比较。我不完全相信由比较两个值的 json 编组的字符串表示形式组成的当前方案将产生准确的结果。 javascript 实现可能比这更微妙。也许这对未来有帮助go.dev/play/p/aaoXrBRzJN7
  • 您的解决方案看起来不错。不要认为有更好的方法。一般在 Go 中奇怪的需求 == 奇怪的代码。
  • @JimB object-hash 包提供对无序数组的支持,这就是我所指的。这不是错误的,只是不同的用例。

标签: arrays json go unordered object-hash


【解决方案1】:

有没有办法在 Go 中考虑 JSON 数组无序?

没有。抱歉,没有魔法可以将数组变成其他东西。 (其实 Go 并没有什么魔力)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多