尝试让这个Bitfinex api库工作,但是得到这个例外。
正常回复。内容
[["tBTCUSD",5694.5,90.04753567,5694.6,90.83915407,-155.4,-0.0266,5694.6,68727.10536905,6007.8,5537]]
和错误响应。内容是
“[\”error\”,20060,\”maintenance”\]”
正常响应会产生异常
ArgumentException...Can not convert Array to String
在
var array = JArray.Load(reader);
if((string)array[0] == "error") // exception
我是json的新手,所以这里的读者内容可能存在基本的格式问题。看来这个字符串没有转换成数组,因此数组[0]保存一个数组..?
编辑:
进一步考虑,我推测API内容格式可能已经改变。在这种情况下,似乎这可能会检查"错误"在错误响应的第一个元素:
if ( array[0].GetType().IsAssignableFrom(typeof(string)) && (string)array[0] == "error")
答案 0 :(得分:0)
当响应有效时,JSON包含一组值数组。当响应无效时,它包含一个值数组,第一个是字符串"error"
。
因此,在使用LINQ to JSON解析之后,需要先检查外部数组中第一个元素的JToken.Type
类型,然后再将其转换为字符串(或数组),例如:像这样:
var array = JArray.Load(reader);
if (array.Count > 0 && array[0].Type == JTokenType.String && (string)array[0] == "error")
{
// Process an error response
Console.WriteLine("Error response detected.");
}
else if (array.Count > 0 && array[0].Type == JTokenType.Array)
{
// Process a successful response.
Console.WriteLine("Normal response detected, array value: ");
var arrayValue = (JArray)array[0];
Console.WriteLine(arrayValue);
}
else
{
// Completely unexpected response.
throw new JsonException("Unexpected response");
}
同样,您可以查看array[0]
是.Net类型JArray
还是JValue
。
您在表达式(string)array[0]
- JTokenExplicit Conversion (JToken to String)
中使用的运算符 - 不会将任意JToken
重新序列化为JSON。相反,只有当它表示原始值(如字符串或整数)时,它才会将JToken
转换为字符串。如果要将array[0]
重新序列化为JSON,则需要使用ToString()
方法,如下所示:
if (array.Count > 0 && array[0].ToString(Formatting.None) == "\"error\"")
{
// Process an error response
}
else // Continue as before
{
}
然而,这将比仅仅检查类型更糟糕。
示例fiddle。