Java 返回json对象作为json rpc响应结果
根据json rpc spec 2.0,响应必须包含结果(成功时)、错误(失败时)和id。到目前为止,我在线看到的所有示例都使用原始数据类型作为整数或简单字符串作为结果。我正在做一个项目,在这个项目中,我需要发送更多的数据作为json rpc调用的结果。因此,我想将结果作为json字符串发送,并将其发送到响应对象的结果值中。例如:Java 返回json对象作为json rpc响应结果,java,php,json-rpc,Java,Php,Json Rpc,根据json rpc spec 2.0,响应必须包含结果(成功时)、错误(失败时)和id。到目前为止,我在线看到的所有示例都使用原始数据类型作为整数或简单字符串作为结果。我正在做一个项目,在这个项目中,我需要发送更多的数据作为json rpc调用的结果。因此,我想将结果作为json字符串发送,并将其发送到响应对象的结果值中。例如: $response = {"result": a_json_string, "error": null, "id": 1} 但在客户端,我收到一个错误,说响应是无效
$response = {"result": a_json_string, "error": null, "id": 1}
但在客户端,我收到一个错误,说响应是无效的json对象。所以我应该坚持json rpc规范,只发送带有json rpc response对象的结果值的原语值,还是可以在响应中发送一个复杂的数据作为结果值,但我的编码有问题,这就是为什么它不起作用的原因?如果可以发送complext值作为响应,那么我将调试代码以发现问题。但在此之前,我只是想知道它是否符合标准
我的json rpc服务器是用php编写的,客户端是用java编写的(一个使用web服务的java应用程序)。$response={“result”:一个json字符串,“error”:null,“id”:1}
这不是一个JSON字符串,并且它不是有效的PHP,因此您实际上没有向我们展示您的真实代码。(奇怪但不相关的是,它是有效的JavaScript代码:-)
在任何情况下,都不需要对序列化为a_JSON\u字符串的数据结构进行JSON加密
例如,如果您之前有一个变量$data
,并且您正在执行此操作:
$a_json_string = json_encode($data);
$response = json_encode(
array("result" => $a_json_string,
"error" => null,
"id" => 1));
相反,请执行以下操作:
$response = json_encode(
array("result" => $data,
"error" => null,
"id" => 1));
我们需要查看更多的代码,以明确了解JSON序列化可能遇到的其他问题。例如,JSON序列化程序可能无法(使用某些数据)判断您是否需要PHPArray()
的Array
或Object
JSON序列化(即:您需要给出提示)。对于JSON字符串,我应该提到它是伪代码。我解决了这个问题。事实上,解决方案类似于您要求我不要执行的第一部分代码:)问题出在客户端(java应用程序)。我希望我正在使用的json rpc客户端库能够提供完整的json响应对象。但实际上它检查响应,并根据成功/错误,以字符串形式给出结果或错误消息。成功后,结果字符串实际上是一个json字符串,我用它创建了json对象,一切正常。非常感谢。如果像第一个这样的方法为您“修复”了它,那么您就错了JSON-RPC。您不应该试图只“打印”JSON-RPC信封的结果
字段。它是一个JSON“值”,可以是字符串
,数字
,对象
,数组
或值空
。相反,你应该确定传输了什么样的数据结构(或者事先商定一个约定),这样你就知道你收到了什么以及如何“打印”。我想我不太理解你的评论,尤其是“尝试打印”部分。我发现我能够发送复杂值(作为json对象)作为json rpc响应的结果值。json rpc客户端和服务器都在我的控制之下,因此我知道/控制方法的确切集合及其参数和参数类型。json rpc服务器是用php编写的,而客户端是用java.net编写的adroid应用程序。由于您可以控制客户端和服务器的实现,因此不需要在服务器端对JSON-RPC信封的result
字段进行“双重编码”(如第一个示例所示)。只需安排客户端适当地访问结果
字段的内容即可。