如果JSON代表'对象',那么什么代表'类'?

时间:2012-07-05 14:10:30

标签: json

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

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

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

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

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

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

修改 我刚刚找到JSON Schema。这是我在寻找什么。它包含的方式超出了我的需要。

修改 我正在寻找更多的'这是通常做的'答案,而不是'你可以尝试......'的答案。 (我可以自己发明几十种可能的答案。)

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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,服务器以适当的方式响应。

答案 2 :(得分:1)

我想你的意思是:

  

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

就像SQL中SELECT * FROM BagsSELECT 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

答案 3 :(得分:0)

我一直在寻找部分回复

RESTful API Design: can your API give developers just the information they need?解释了这一切,并提供了来自LinkedIn,Facebook和Google的示例。谷歌和Facebook都有类似的方法。以下是Lie Ryan使用Google方法的例子:

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

由于谷歌和Facebook支持这一点,我不会惊讶地发现这已成为事实上的标准。

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