2012-07-05 52 views
1

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

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

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

关键在于它是完全控制服务器返回的数据字段(名称 - 值对)的客户端。这与我迄今在Web上发现的所有客户端发出请求(通常包含非常有限的一组参数,如果有的话)以及服务器决定哪些字段的决定有点不同返回JSON回复。 (显然,客户端要求的服务器的数据模型必须与服务器的数据模型一致;如果服务器有一组各自具有自己价格的小部件,则客户端不能要求各自拥有自己价格的数组的数组,小部件)。

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

编辑 我刚刚发现JSON Schema。这是不是我在找什么。它包含比我需要的更多的方式。

编辑 我在寻找更多的'这是通常如何做'的答案,而不是'你可以试试...'的答案。 (我自己可以发明几十个可能的答案。)

回答

0

我一直在寻找部分响应

RESTful API Design: can your API give developers just the information they need?解释了这一切,并提供了LinkedIn,Facebook和Google的示例。 Google和Facebook都有类似的方法。这里的谎言瑞安的例子会是什么样使用谷歌的做法:

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

由于谷歌和Facebook是这背后,我也不会惊讶地看到这成为一个事实上的标准。

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

1

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

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

服务器然后可以从所使用的密钥检测类名和用于阵列中的名称返回所提供的值如果该类支持它,或者如果它不忽略。

+0

我明白了。是的,我认为这将起作用。对于第二层次的层次结构,我似乎需要在数组中插入新对象而不是字符串。我的原始问题仍然存在:这是如何解决这个问题'在那里'? – 2012-07-06 08:29:19

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,服务器以适当的方式响应。

1

我觉得你这是什么意思:

客户端是什么数据字段(name-value对)服务器返回的完全控制。

就像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