JSON响应始终是对象吗?

时间:2018-07-26 08:04:36

标签: android json

我想知道来自API的响应是否始终是对象?我正在使用来自已更新的API的数据,响应格式已更改。以前,我得到了一个对象数组,并使用Gson将其映射到List,但是现在我得到了一个包含数组和其他字符串的对象。我想知道之前得到的只是一个数组还是它还是一个对象。

首先,我正在处理此问题:

[
    {
      "id": 1 
      "name": "john"
    }, 
    {
      "id": 2 
      "name": "jack"
    }

]

现在:

{
   "users": [],
   "statusCode": 200,
   "statusMessage": "success",
}

2 个答案:

答案 0 :(得分:0)

Json响应可以是名称/值对的集合,这意味着对象。另外,此响应可以是值的有序列表,表示数组

参考: https://www.json.org/

答案 1 :(得分:0)

您的问题定义不明确,因为在这种情况下,没有对“对象”的任何明显解释。以下内容演变成“是,但是不,是,而是” 讨论,但是希望至少可以让您根据您的实际意思得出一个暂定的“是”或“否”结论。 (如果您急忙,可以向下滚动到水平线,或向下搜索“无关”。)

,JSON响应只是具有某些限制条件的UTF-8字符串。 "500 Internal server error"{"hovercraft": ["eel", "eel", "eel", "eel"]}一样都是有效的JSON(由于双引号)。完整说明请参见http://json.org/

但是是的字符串是某些编程语言(例如Javascript和Python)中的对象;尽管,但它们不在Perl和Lisp之类的许多其他公司中。像asm和C这样的底层语言甚至没有拥有对象。无论如何,这几乎肯定不是您的意思,所以主要只是学术题外话。

顾名思义,JSON是一种JavaScript Object Notation格式,尽管它早已与JavaScript语言分离了。因此,,根据定义,JSON字符串编码称为对象的某些对象的序列化;但另一方面,,序列化本身不是该对象。比较如何将字符串"123"解析为整数123,但是(在大多数语言中)是具有不同类型的不同表示形式,您可以在其中执行诸如length()substring(i,j)之类的操作在数字上没有多大意义;而诸如减法和除法之类的数字运算的定义不明确,甚至无法在许多语言中对字符串执行。

要使API有意义,发送者和接收者需要就消息的语义达成一致。仅JSON不能实现这一点。它仅传输结构化容器的内容,而不传输具有方法的类形式的完整对象。所以,这不是完整的对象; API实现仍需要在发送方和接收方中分别存在。但是,另一方面,如果这是给定的,则,重新实例化通信对象所需的所有操作都在对象的JSON序列化中。

可能至少客户端或服务器是用一种语言编写的,该语言使用具有支持面向对象编程的方法的类。在这种情况下,,该实现可能会内部或几乎透明地将JSON序列化转换为对象。但是可以用C编写相同的逻辑,其中这种表示形式很可能成为struct,程序员需要注意加强表示形式的完整性等;但是,另一方面,您可能会认为这是一个对象,而将管理内存和仅运行正确方法的负担转移到程序员的肩膀上是实现细节。 (编程语言的历史可能会有相反的说法;但是,即使对于非面向对象的语言来说,OOP语义是一个合理的参考模型也不为过。)


无论您是“是”还是“否”,问题中的两个响应都是有效的JSON结构。如果一个是对象,那么另一个也是。 (尽管只有前者是一个结构数组,如果更具体地是您期望或希望的那样。)不管如何,更改API以返回与以前完全不同的结构肯定不是当前最佳实践。

(目前的最佳做法是更改新版本API的URL,并可能在旧URL上并行保留旧版本一段时间。)