JArray.Load,没有加载数组?格式错误?

时间:2017-10-24 19:12:15

标签: c# .net json json.net

尝试让这个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]保存一个数组..?

enter image description here

编辑:

进一步考虑,我推测API内容格式可能已经改变。在这种情况下,似乎这可能会检查"错误"在错误响应的第一个元素:

 if ( array[0].GetType().IsAssignableFrom(typeof(string)) && (string)array[0] == "error")

1 个答案:

答案 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