当从服务器接收JSON响应时,开发人员的期望是什么

当从服务器接收JSON响应时,开发人员的期望是什么,json,Json,我有运行Web服务的java库,这些服务返回XML响应。Web服务都围绕着提供项目的详细信息列表展开。最近,做了一些更改,允许服务通过简单地将XML转换为JSON来返回JSON。当我看到这些回复时,我发现它们不像我想象的那么容易解析。例如,返回项目详细信息的Web服务 如果没有项目,返回的JSON如下: {"ItemResponse":""} 如果有1个项,则响应如下(现在itemResponse将对象作为值而不是字符串): 如果有两个或多个项,则响应为(现在项将数组作为值而不是对象): 要解

我有运行Web服务的java库,这些服务返回XML响应。Web服务都围绕着提供项目的详细信息列表展开。最近,做了一些更改,允许服务通过简单地将XML转换为JSON来返回JSON。当我看到这些回复时,我发现它们不像我想象的那么容易解析。例如,返回项目详细信息的Web服务

如果没有项目,返回的JSON如下:

{"ItemResponse":""}
如果有1个项,则响应如下(现在itemResponse将对象作为值而不是字符串):

如果有两个或多个项,则响应为(现在项将数组作为值而不是对象):

要解析这些,您需要几个if/else,我认为它们很笨拙

如果回答是:

  • 0项:[]
  • 1项:[{“名称”:“项目1”,“成本”:“$5”}]
  • 2项:[{“名称”:“项目1”,“成本”:“$5”},{“名称”:“项目2”,“成本”:“$3”}]
这样,总是有一个数组,它包含itemdata。可以使用额外的包装器对象:

  • 0项:{“项”:[]}
  • 1项目:{“项目”:[{“名称”:“项目1”,“成本”:“$5”}]}
  • 2项:{“项目”:[{“名称”:“项目1”,“成本”:“$5”},{“名称”:“项目2”,“成本”:“$3”}]}
我没有JSON方面的经验,所以我的问题是,如果您是一名必须使用这些Web服务的开发人员,您希望如何格式化JSON响应?即使没有项目,始终返回一致的数组是否更好,或者这通常并不重要?或者仅仅一个数组是不够的,您真的希望数组周围有一个包装器对象吗


与此相关的约定/标准是什么?

不要切换结果类型,如果可能有更多项,请始终返回一个数组。不要混合,对于一个项目,一个对象,一个数组。那不是个好主意

另一个最佳实践是您应该对API进行版本设置。使用类似于
yoursite.com/api/v1/endpoint
的东西。如果不这样做,就更改API的响应。你所有的客户端应用程序都将崩溃。因此,请将这一点与文档一起牢记在心。(我过去经常看到这种情况……)


作为一名开发人员,我个人喜欢您的第二种方法,但这也是一种偏好。这方面没有标准。

使用json有几个原因:

  • 更加密集和紧凑:因此发送的数据更少
  • 在javascript中,您可以直接访问这些属性,而无需解析任何内容。这意味着您可以将其转换为对象并读取属性(通常用于AJAX)
  • 同样,在java中,您通常不需要自己解析json——有几个很好的库,比如www.json.org/java/index.html
  • 如果您需要知道如何构建json。。。使用谷歌。。。有很多信息
对于您的实际问题:

  • 对于Web服务,您通常可以选择xml和json作为“消费者”尝试: 和
  • 没有必要以可视化的方式格式化json——它不适合像xml一样阅读吗
  • 如果您的响应没有结果,json服务通常仍然会给出响应文本——再看看上面的google地图链接——这些链接包括一个响应状态,这很有意义,因为它是一个服务

尽管如此,如果没有特定的需求,是否值得将xml转换为json仍然是一个问题。正如迪特提到的:这取决于谁已经在使用这项服务以及他们是如何消费的。。。这意味着周围的环境非常重要。

重要的是记录输出的格式。如果您确实使用一致的格式,也就是始终有一个数组,您会发现记录它(以及用户处理它)要容易得多。我会选择第二个版本,因为它允许您添加不同类型的数据(包括错误!)…现在还没有人使用它,我正在尝试以一种人们可以并且会使用它的方式来使用它-他们只需付出最小的努力。你是说在我的问题中所描述的三种方式中,JSON的格式是哪一种并不重要,而且它们对开发人员都同样可用?目前还没有版本,我仍在开发它(但我会记住提示,谢谢)。我只是好奇json通常是如何格式化的。我的直觉告诉我和你的直觉一样:保持一致。
{"ItemResponse":{"Items":{"Name":"Item1","Cost":"$5"}}}
{"ItemResponse":{"Items":[{"Name":"Item1","Cost":"$5"},{"Name":"Item2","Cost":"$3"}]}}