JSON似乎是一种用纯文本表示复杂数据结构的好方法。如果我们认为这个复杂的数据结构类似于OOP对象 - 一个类的实例 - 那么是否有一种常用的类似JSON的格式来表示类本身(只是数据部分 - 忘记方法)? JSON本身可以用于此吗?
换句话说,如果JSON对名称 - 值对进行编码,如果我只想对名称进行编码,我应该使用什么?
我想要这个的原因是我正在设计一个与jQuery一起使用的协议(顺便说一下,我是一个完整的新手)。客户端将向服务器传达它想要的JSON对象的结构,服务器将返回该结构的JSON对象,并添加了值。
关键是,客户端可以完全控制服务器返回的数据字段(名称 - 值对)。它与我在网络上发现的jQuery的所有示例有点不同,客户端发出请求(通常包括一组非常有限的参数,如果有的话),服务器决定哪些字段在JSON回复中返回。
(显然,客户要求的必须与服务器的数据模型一致;如果服务器有一个小部件数组,每个小部件都有自己的价格,客户端不能要求每个都有自己的小部件的价格数组。)
这一定是个常见问题,我不想重新发明轮子。我想采用一种在网络上已经普遍使用的解决方案。
修改 我刚刚找到JSON Schema。这是不我在寻找什么。它包含的方式超出了我的需要。
修改 我正在寻找更多的'这是通常做的'答案,而不是'你可以尝试......'的答案。 (我可以自己发明几十种可能的答案。)
答案 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 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
答案 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,但这对我来说是一个很好的起点。