如果JSON表示';对象';,代表';类';?

如果JSON表示';对象';,代表';类';?,json,Json,JSON似乎是一种用纯文本表示复杂数据结构的好方法。如果我们认为这种复杂的数据结构类似于OOP对象(类的实例),那么是否有一种常用的类似JSON的格式来表示类本身(只是数据部分-忘记方法)?JSON本身可以用于此目的吗 换句话说,如果JSON编码名称-值对,如果我只想编码名称,我应该使用什么 我想要这样做的原因是,我正在设计一个与jQuery一起使用的协议(顺便说一句,我对jQuery完全是新手)。客户端将向服务器传递它想要返回的JSON对象的结构,服务器将返回该结构的JSON对象以及添加的值

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

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

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

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

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

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

编辑 我刚找到。这不是我要找的。它包含的内容比我需要的多

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

要在JSON中只编码名称,可以使用一个键/值对,其中键要么是类名,要么只是一个名为“values”的键,值是一个字符串数组,这些字符串是服务器返回的名称。例如:

{ 'class_name' : [ "name1", "name2", "name3" ] }
然后,服务器可以从使用的键中检测类名,如果类支持,则返回为数组中的名称提供的值;如果不支持,则忽略

我在寻找一个“这就是通常的做法”的答案

没有一种“正确”的方式来做你想做的事。许多人都有自己的实现。这取决于各种因素——你想做什么,你想在哪里做,你想让它做得多有效


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

对于嵌套结构,可以使用嵌套数组。比如:

{
    "nestedfield1": {
        "nestedfield11":["nestedfield111", "nestedfield112"],
        "nestedfield12":["nestedfield121", "nestedfield122"],
        "__SIMPLE_FIELDS__": ["simplefield13", "simplefield14"]
    }
}
1 => <the structure above>
2 => ["simplefield1", "simplefield2" ..]
3 => etc .. etc
关键是,如果键是
\uuuuu SIMPLE\u FIELDS\uuuu
,则值是一个简单字段数组(字符串、数字等),否则键代表对象中的键


对于更复杂的问题,我建议您使用预定义的结构,服务器和客户端都知道这些结构。当您必须发出多个相同的请求时,这尤其有用。为它们中的每一个分配一些唯一的编号。比如:

{
    "nestedfield1": {
        "nestedfield11":["nestedfield111", "nestedfield112"],
        "nestedfield12":["nestedfield121", "nestedfield122"],
        "__SIMPLE_FIELDS__": ["simplefield13", "simplefield14"]
    }
}
1 => <the structure above>
2 => ["simplefield1", "simplefield2" ..]
3 => etc .. etc
1=>
2=>[“simplefield1”,“simplefield2”。]
3=>等等。。等

服务器将上述结构和相关编号存储在数据库或其他文件中。现在,很明显,客户端发送所需结构的id,服务器以适当的方式响应。

我想你的意思是:

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

类似于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对象;我见过一些实现,其中字段名取自查询字符串,比如我在寻找部分响应

解释了这一切,并给出了LinkedIn、Facebook和谷歌的例子。谷歌和Facebook都有类似的方法。下面是Lie Ryan的例子在使用谷歌的方法时的表现:

url?fields=status,result(color,price)
既然谷歌和Facebook是幕后推手,看到这成为事实上的标准,我不会感到惊讶


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

我明白了。是的,我想那会有用的。对于第二级层次结构,我似乎需要在数组中插入一个新对象而不是字符串。我最初的问题仍然是:这个问题通常是这样解决的吗?