2013-09-26 81 views
2

在我的代码,我有一个创建JSON请求我的比特币服务器功能:Newtonsoft 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); 
    [...] 

当我将它传递parameters的:

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"]]}" 

(注意周围列表中的额外的支架)

我怎样才能确保序列化对象是在我的期望格式?

回答

2

改变你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); 
      } 
     } 
1

我认为问题出在您想要添加到JArray中的列表地址参数中。

如果检查JArray(道具)的大小,你会在添加地址之前看到,计数为2,这是正确的,而插入地址后,就变成4

[ 0, 9999, “ms8G6E6J4no1KgRt9j3KyoniRgazRgDX1Q”, “mzPs8fwypX8oiRGHjYHXMSbSoEdz1zgcAH” ]

你能包裹住地址为复杂类型,并传递作为参数?