【问题标题】:Can you always nest a JSON object in a JSON array?你总是可以在 JSON 数组中嵌套一个 JSON 对象吗?
【发布时间】:2017-09-09 06:02:54
【问题描述】:

当通过 POST、PUT 或类似方式发送 JSON 数据时,是否发送嵌套在 Array 中的所有对象?

例如。 这是

"""
{ 
  "candle" : {"ask": null,
  "bid": null,
  "complete": "True",
  "mid": {"c": "0.80628", "h": "0.80628", "l": "0.80628", "o": "0.80628"},
  "time": "2017-09-08T17:27:15.000000000Z",
  "volume": "6"}
}
 """

 """
{ 
  "candle" : [{"ask": null,
  "bid": null,
  "complete": "True",
  "mid": {"c": "0.80628", "h": "0.80628", "l": "0.80628", "o": "0.80628"},
  "time": "2017-09-08T17:27:15.000000000Z",
  "volume": "6"}]
}
 """

等效?

我想这取决于服务器。但是,如果只有一个对象,最好只发送对象吗?

或者将所有内容作为数组发送是否很常见?

如果我可以将所有内容都发送到一个数组中,将会降低复杂性

【问题讨论】:

  • 那不是 JSON。 JSON 只在字符串周围使用双引号,而不是单引号。
  • 你永远不应该尝试自己构造 JSON,使用 json.dump 函数。它知道正确的语法。
  • ipython 只是格式化 JSON 的 dict 表示比字符串好得多...我修复了它
  • 不是将其格式化为 JSON,而是使用 Python 语法对其进行格式化。
  • 我认为这与问题无关。如果有人真的想使用它,现在应该是正确的

标签: python arrays json


【解决方案1】:

我想这取决于服务器。

是的,服务器通常需要特定格式的数据。如果您以其他格式发送数据,服务器可能不知道您在说什么。

但是如果只有一个对象,最好只发送对象吗?

没有特别的最佳做法,这取决于相关数据。使用数组可以提供更大的灵活性(例如,将来您可能希望接受多个对象)但灵活性可能会令人困惑,或者增加不必要的复杂性。视情况而定。

或者将所有内容作为数组发送是否很常见?

不,数据应该以有意义的方式结构化。

如果我可以将所有内容都发送到一个数组中,将会降低复杂性

我不明白在一般情况下这是如何正确的(相反的情况可能更常见),但如果这是您正在使用的服务的特定问题,也许您可​​以将该反馈提交给服务所有者并他们可以探索更改 API。如果这是您的服务,那就去做吧 - 使用任何对您有意义的数据格式。

【讨论】:

  • 很好的答案!谢谢。好吧,我喜欢在 python 中使用 lit comp。因此,如果我总是使用列表组合和json.dumps 它。它总是在Array - 这就是我的想法
  • 为工作使用正确的工具 - 列表推导式非常好,但要专注于问题和目标,而不是试图将目标按摩成使用你喜欢的工具。我最近在另一个问题(关于 Java)中发布了some similar advice
  • @JamesSchinner 在任何答案中似乎都没有提到的东西。从理论上讲,您可以将数据构建为任意级别的嵌套字典,而永远不要触及数组(前提是您总是有有意义的键来制作子字典)。然而,字典并不能维持秩序。如果您需要按特定顺序提供对象,那么您可以提供一个数组,该数组将保持顺序,并配置服务器以按预期解析它们的顺序解析它们。
【解决方案2】:

如果您必须遵循现有协议,您别无选择。

如果您自己设计协议,那么您必须选择。对于(永远)单个对象,数组方法没有优势。但是,如果将来可以出现更多对象,则数组方法会更加灵活和面向未来。

【讨论】:

  • 谢谢,所以对于什么是可以接受的没有业界共识?就我而言,我需要确切了解发送的数据需要如何安排。
  • 这不是关于共识,而是关于目的。在需要 repeated things 容器的地方使用数组是合理的。在使用 单一事物 的情况下,该数组是不合理的。
【解决方案3】:

它们不是等价的,数组和对象是不同的。

但这并不重要, 在示例 1 中,您只能拥有一根蜡烛。 在示例 2 中,您可以有多个蜡烛。 如果您只想代表一根蜡烛,我认为没有任何理由使用数组。如果你使用对象而不是数组,复杂性(至少计算上的)会更少。

【讨论】:

    【解决方案4】:

    不等价:项目列表不等同于单个项目。

    【讨论】:

    • 我认为在这种情况下,平等和等价之间存在细微差别。这个问题更微妙
    • 它们在任何意义上都不等价或相等,除非服务器准备接收单例而不是单元素列表。
    • 需要明确的是,JSON 中没有这样的等价概念; { "foo": { "bar": "baz" } } 是与 { "foo": [ { "bar": "baz" } ] } 完全不同的结构。
    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多