1

JSON 似乎是一种用纯文本表示复杂数据结构的好方法。如果我们认为这种复杂的数据结构类似于 OOP 对象——类的实例——那么是否有一种常用的类 JSON 格式来表示类本身(只是数据部分——忘记方法)?JSON 本身可以用于此目的吗?

换句话说,如果 JSON 对名称-值对进行编码,如果我只想对名称进行编码,我应该使用什么?

我想要这个的原因是我正在设计一个与 jQuery 一起使用的协议(顺便说一下,我是一个完全的新手)。客户端将向服务器传达它想要返回的 JSON 对象的结构,服务器将返回该结构的 JSON 对象并添加了值。

关键是客户端完全控制服务器返回的数据字段(名称-值对)。它与我目前在 Web 上找到的所有 jQuery 示例有点不同,在这些示例中,客户端发出请求(通常包括一组非常有限的参数,如果有的话),服务器决定哪些字段在 JSON 回复中返回。

(很明显,客户端要求的内容必须与服务器的数据模型一致;如果服务器有一个小部件数组,每个小部件都有自己的价格,客户端就不能要求一个价格数组,每个小部件都有自己的小部件。)

这一定是一个普遍的问题,我不想重新发明轮子。我想采用一种已经在网络上普遍使用的解决方案。

编辑 我刚刚找到JSON Schema。这不是我要找的。它包含的东西比我需要的要多。

编辑 我更多的是寻找“这就是通常的做法”的答案,而不是“你可以尝试……”的答案。(我自己可以发明几十个可能的答案。)

4

4 回答 4

1

要仅对 JSON 中的名称进行编码,您可以使用键/值对,其中键是类名或只是名为“值”的键 - 值是一个字符串数组,这些字符串是服务器返回的名称. 例如:

{ 'class_name' : [ "name1", "name2", "name3" ] }

然后,服务器可以从使用的键中检测类名,如果类支持,则返回数组中名称的提供值,如果不支持,则忽略。

于 2012-07-05T14:35:46.653 回答
1

我正在寻找更多“这就是通常的做法”的答案

没有单一的“正确”方式来做你想做的事。很多人都有自己的实现。这取决于各种因素——你想做什么,你想在哪里做,你希望它做的效率如何?


对于简单的结构,我更喜欢并建议@dbr9979 给出的答案。

对于嵌套结构,您可以使用嵌套数组。就像是:

{
    "nestedfield1": {
        "nestedfield11":["nestedfield111", "nestedfield112"],
        "nestedfield12":["nestedfield121", "nestedfield122"],
        "__SIMPLE_FIELDS__": ["simplefield13", "simplefield14"]
    }
}

关键是,如果键是__SIMPLE_FIELDS__,则值是简单字段(字符串、数字等)的数组,否则键代表对象中的键。


对于更复杂的事情,我建议您使用服务器和客户端都知道的预定义结构。当您必须发出多个相同的请求时,这特别有用。为每个人分配一个唯一的编号。就像是:

1 => <the structure above>
2 => ["simplefield1", "simplefield2" ..]
3 => etc .. etc

服务器将上述结构和相关编号存储在数据库或其他东西中。现在,正如现在可能很明显的那样,客户端通过所需结构的 id 发送,服务器以适当的方式响应。

于 2012-07-06T09:03:57.253 回答
1

我想你的意思是:

完全控制服务器返回的数据字段(名称-值对)的客户端。

就像SQL 中的SELECT * FROM Bags和之间的区别。SELECT color, price FROM Bag我对你的解释正确吗?

您可以查询:

{
    'resource': 'Bag',
    'field_names': ['color', 'price']
}

这将返回响应:

{
    'status': 'success',
    'result': [
        {'color': 'red', 'price': 50},
        {'color': 'blue', 'price': 45},
    ]
}

不过,最有可能的是,您实际上可能并不需要您的请求是 JSON 对象;我已经看到从查询字符串中获取字段名称的实现,例如http://foo.com/bag?fields=color,price

于 2012-07-06T10:02:31.890 回答
0

我正在寻找部分响应

RESTful API 设计:您的 API 能否为开发人员提供他们需要的信息?解释了这一切,并给出了来自 LinkedIn、Facebook 和 Google 的示例。谷歌和 Facebook 都有类似的方法。以下是 Lie Ryan 的示例使用 Google 方法的外观:

url?fields=status,result(color,price)

由于谷歌和 Facebook 支持这一点,因此看到这成为事实上的标准,我不会感到惊讶。

在我的情况下,我可能会遇到 URL 的长度限制,因此必须改用 POST,但这对我来说是一个很好的起点。

于 2012-07-06T13:06:38.123 回答