【问题标题】:Reading multiple JSON objects on a JSON-RPC connection在 JSON-RPC 连接上读取多个 JSON 对象
【发布时间】: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 消息?

【问题讨论】:

    标签: json network-programming sax json-rpc


    【解决方案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 协议的责任。好的。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多