在 JSON-RPC 连接上读取多个 JSON 对象

Posted

技术标签:

【中文标题】在 JSON-RPC 连接上读取多个 JSON 对象【英文标题】:Reading multiple JSON objects on a JSON-RPC connection 【发布时间】:2014-06-28 23:02:54 【问题描述】:

我正在制作一个流式 API,它处理 RPC 样式调用以及从服务器到客户端的通知(不是 JSON-RPC 规范中的客户端到服务器的通知)。不幸的是,最后一部分排除了 JSON-RPC + 持久 HTTP。

API 基于 JSON 和 JSON-RPC 规范。

JSON - http://www.ietf.org/rfc/rfc4627.txt

JSON-RPC - http://www.jsonrpc.org/specification

典型的会话可能是:

-> Sending to server
<- Receiving from server    

-> 'id': 0, 'method':'login','params':'token':'secret'
<- 'id': 0, 'method':'login','result':0
-> 'id': 1, 'method':'subscribe','params':'symbol':'VOD.L'
<- 'id': 1, 'method':'subscribe','result':0
...
<- 'method':'notifyPrice','params':'symbol':'VOD.L', 'bid':10.1, 'ask':10.03
<- 'method':'notifyPrice','params':'symbol':'VOD.L', 'bid':10.2, 'ask':10.03

上述消息,尤其是通知,可以按任何顺序出现在同一个数据包中。这两个规范似乎都没有包含消息分隔符的详细信息,这使得在不使用基于 SAX 的 JSON 解析器的情况下很难知道何时接收到完整的 JSON 消息,这与 DOM 对应物相比相当罕见。

我是否遗漏了一些明显的东西,还是真的没有标准方法来区分通过网络传入的多个 JSON 消息?

【问题讨论】:

【参考方案1】:

你错过了什么:-)

每个 JSON-RPC 消息都是一个有效的 JSON 值。 JSON 值可以是以下任何一种:

Array Object String Number

JSON-RPC 信封是Object

如果这是一个原始套接字(如 Telnet),那么...

对象以 开头,以 结尾。 如果您在接收器上使用了正确类型的解析器(拉式或面向事件的),那么无论Objects 和Arrays 的嵌套程度如何,您仍然会知道何时点击它最后

上述消息,尤其是通知,可以按任何顺序出现在同一个数据包中。

只要请求不交错(一个在下一个开始之前完成),那么就没有问题。是否还需要换行符终止信封(也称为面向行的协议)取决于您。

但是,当您处理 HTTP...

为什么不根据 JSON-RPC 规范只使用 batch 消息?

【讨论】:

是的,我同意你所说的一切,但正如我在问题中所说的那样,面向 SAX/事件的 JSON 解析器并不多——它们没有经过很好的测试/使用。而且,我不需要面向 SAX/事件的实现 - 消息不长,而且我的内存也不短,我不希望仅仅为了查找消息何时终止而解析消息。此外,我没有使用 HTTP,而且无论使用批处理都无济于事,因为如果不使用 SAX/面向事件的解析器,您仍然不知道批处理何时结束。 另外,问题是“真的没有标准方法来分隔通过网络传入的多个 JSON 消息吗?”您说过我可以使用换行符终止符,但这不在规范中,并且肯定会导致与其他 JSON RPC 库不兼容? I could use a newline terminator, but that's not in the spec 在什么规格中? JSON-RPC 规范与传输协议无关。 HTTP 包含大量的换行符(这对 HTTP 有一定的意义,但对 JSON-RPC 没有意义),它是 JSON-RPC 最常用的传输协议。 JSON-RPC 规范处理专门结构化的 JSON 消息。它不关心您在其中嵌入了这些 JSON 消息的其他协议。您是否花一些时间阅读了有关 batch 消息的信息? 我认为您对 JSON-RPC 规范所说的内容、传输协议是什么以及各种库的作用感到非常困惑。消息的批处理发生在 JSON-RPC 消息本身内部。您无需进行任何额外的解析(除了识别 JSON-RPC 消息本身的结尾)。如果您使用的传输协议没有自然分隔符(即原始 TCP 套接字),那么您必须自己跟踪协议状态。就此而言,SAX/事件解析器通常是常量内存解析器......为什么内存会成为一个问题? 好的,关于 JSON-RPC 和底层协议之间的分离的观点。我错过了。这确实是问题的答案 - 没有办法分离消息,因为这不是 JSON-RPC 协议的责任。好的。 :)

以上是关于在 JSON-RPC 连接上读取多个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

连接到json-rpc接口

基于 JSON-RPC 2.0 的 API 出现问题

传递对 XBMC json-rpc 的引用以稍后确定答案

Swagger 和 json-rpc

我可以使用 JSON-RPC 将文件发布到网络服务吗?

用于嵌入式平台的 C++ 中的简单 JSON-RPC?