c# - Newtonsoft JSON - 数组未正确序列化

标签 c# json list serialization json.net

在我的代码中,我有一个函数可以向我的比特币服务器创建 JSON 请求:

public static JObject InvokeMethod(string sMethod, params object[] parameters)
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Url);
    webRequest.Credentials = Credentials;

    webRequest.ContentType = "application/json-rpc";
    webRequest.Method = "POST";

    JObject joe = new JObject();
    joe["jsonrpc"] = "1.0";
    joe["id"] = "1";
    joe["method"] = sMethod;

    if (parameters != null)
    {
        if (parameters.Length > 0)
        {
            JArray props = new JArray();
            foreach (var p in parameters)
            {
                props.Add(p);
            }
            joe.Add(new JProperty("params", props));
        }
    }

    string s = JsonConvert.SerializeObject(joe);
    [...]

当我传递给它的参数时:

int minconf, int maxconf, List<string> addresses

0, 9999, ["ms8G6E6J4no1KgRt9j3KyoniRgazRgDX1Q", "mzPs8fwypX8oiRGHjYHXMSbSoEdz1zgcAH"]

生成的字符串 s 如下所示:

"{"jsonrpc":"1.0","id":"1","method":"listunspent","params":[0,9999,"ms8G6E6J4no1KgRt9j3KyoniRgazRgDX1Q","mzPs8fwypX8oiRGHjYHXMSbSoEdz1zgcAH"]}"

而服务器期望的字符串应该是这样的:

"{"jsonrpc":"1.0","id":"1","method":"listunspent","params":[0,9999,["ms8G6E6J4no1KgRt9j3KyoniRgazRgDX1Q","mzPs8fwypX8oiRGHjYHXMSbSoEdz1zgcAH"]]}"

(注意列表周围的额外括号)

我怎样才能确保序列化的对象是我想要的格式?

最佳答案

改变你的foreach循环如下

        foreach (var p in parameters)
        {
            if (p.GetType().IsGenericType && p is IEnumerable)
            {
                JArray l = new JArray();
                foreach (var i in (IEnumerable)p)
                {
                    l.Add(i);
                }
                props.Add(l);
            }
            else
            {
                props.Add(p);
            }
        }

关于c# - Newtonsoft JSON - 数组未正确序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017948/

相关文章:

c# - boolean 变量的所有可能组合

javascript - 未捕获的类型错误 : Cannot read property 'props' of null

css - 与外边框相比,内边框更厚

list - 如何将对象列表注入(inject)温莎城堡的构造函数中

python - 将数据帧列转换为列表列表,然后转换回数据帧,同时保持 ID 关联

c# - 展开集合并保存一些字段。

c# - 使用 Linq 对交错数组(求和、平均值、其他函数)进行列操作

c# - 查找具有包含特定属性值的属性的所有类

c# - JsonConvert 不转换 UTC -> PopulateObject 中的本地时间

java - 错误 : failed to read input object (not a Template?):将 YAML 转换为 JSON 时出错:yaml:在此上下文中不允许映射值