如何在 C# 中的 JSON-RPC 2.0 中编写“参数”?

Posted

技术标签:

【中文标题】如何在 C# 中的 JSON-RPC 2.0 中编写“参数”?【英文标题】:How to write "params" in JSON-RPC 2.0 in C#? 【发布时间】:2017-06-27 20:50:22 【问题描述】:

我想使用 JSON-RPC 来控制一个名为 aria2 的应用程序。当它不需要参数时我可以控制它。但是我尝试了很多方法,我从来没有成功地用参数控制它。

我试过的一些代码是这样的:

if (secret != null && secret != "")
    json = JsonConvert.SerializeObject(new JObject  ["jsonrpc"] = "2.0", ["id"] = "m", ["method"] = "aria2.addUri", ["params"] =  "token:" + secret, "[http://csharp.org/file.zip]"  );
else
    json = JsonConvert.SerializeObject(new JObject  ["jsonrpc"] = "2.0", ["id"] = "m", ["method"] = "aria2.addUri", ["params"] = @"[http://csharp.org/file.zip]" );

我也试过了:

if (secret != null && secret != "")
    string json = "\"jsonrpc\": \"2.0\",\"method\": \"aria2.addUri\",\"params\": \"token:\"" + secret + "\",\"http://csharp.org/file.zip\",\"id\": \"m\"";
else
    string json = "\"jsonrpc\": \"2.0\",\"method\": \"aria2.addUri\",\"params\": \"http://csharp.org/file.zip\",\"id\": \"m\"";

我已经尝试了很多 ['" 的组合和排列,但没有任何效果。

这是关于 Python 的 aria2 的 RPC 指南: https://aria2.github.io/manual/en/html/aria2c.html#rpc-authorization-secret-token

【问题讨论】:

【参考方案1】:

这是一些初学者可能想知道的解决方案。

首先,知道你要输出什么,在这种情况下是:

"jsonrpc":"2.0","id":"m","method":"aria2.addUri","params":["token:secret",["http://csharp.org/file.zip"]]

结果在这里:http://jsoneditoronline.org/?id=4ee8fb1e0314e124bd3ab7d4b2ed19f1


然后,小提示 [] 不在参数的值范围内,所以它们是数组,而不是字符串。它不能使用["params"] = ,它也不会覆盖字符串到数组,例如,以下错误代码:

JsonConvert.SerializeObject(new JObject  ["params"] = "[\"token:secret\", [\"http://csharp.org/file.zip\"]]" );

只得到:

"params":"[\"token:secret\", [\"http://csharp.org/file.zip\"]]"

最重要的是token的格式,不是 JProperty()JObject() 中,只是params 中的一个字符串 JArray()。而且uri也在params的JArray()JArray()中。所以 正确的版本是:

JArray param = new JArray  "token:secret", new JArray  "http://csharp.org/file.zip"  ;
string json = JsonConvert.SerializeObject(new JObject  ["jsonrpc"] = "2.0", ["id"] = "m", ["method"] = "aria2.addUri", ["params"] = param );
JArray()[]JObject()JArray()JObject()

如果我们不需要JsonConvert(),正确的版本很简单:

string json = " \"jsonrpc\": \"2.0\", \"id\": \"m\", \"method\": \"aria2.addUri\", \"params\": [\"token:secret\", [\"http://csharp.org/file.zip\"]] ";
在这种情况下,我们无法将 " 更改为 '

【讨论】:

以上是关于如何在 C# 中的 JSON-RPC 2.0 中编写“参数”?的主要内容,如果未能解决你的问题,请参考以下文章

json-rpc 参数版本 1.0 vs 2.0

.NET 开源项目 StreamJsonRpc 介绍[上篇]

使用golang 实现JSON-RPC2.0

C# 中 JSON-RPC 客户端的示例代码

没有 ASP.NET 的 C# JSON-RPC 网络服务器

是否有任何适用于 C# 的独立 json-rpc 服务器库? [关闭]