C# JArray.加载,而不是加载数组?格式错误?

C# JArray.加载,而不是加载数组?格式错误?,c#,.net,json,json.net,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 St

正在尝试使此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

我是json新手,所以读者内容可能存在一个基本的格式问题。似乎此字符串未转换为数组,因此数组[0]包含一个数组

编辑:

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

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

当响应有效时,JSON包含一个值数组数组。当响应无效时,它包含一个值数组,第一个值是字符串
“error”

因此,在使用LINQ解析为JSON后,您需要在将外部数组中的第一个元素转换为字符串(或数组)之前检查其类型,例如:

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");
}
类似地,您可以检查
数组[0]
是否为.Net类型

表达式
(字符串)数组[0]
-->中使用的运算符不会将任意
JToken
重新序列化为JSON。相反,仅当它表示字符串或整数等基本值时,才会将该
JToken
转换为字符串。如果要将
数组[0]
重新序列化为JSON,则需要使用如下方法:

if (array.Count > 0 && array[0].ToString(Formatting.None) == "\"error\"")
{
    // Process an error response                
}
else // Continue as before
{
}
但是,这将比简单地检查类型具有更差的性能


示例。

当响应有效时,JSON包含一个值数组数组。当响应无效时,它包含一个值数组,第一个值是字符串
“error”

因此,在使用LINQ解析为JSON后,您需要在将外部数组中的第一个元素转换为字符串(或数组)之前检查其类型,例如:

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");
}
类似地,您可以检查
数组[0]
是否为.Net类型

表达式
(字符串)数组[0]
-->中使用的运算符不会将任意
JToken
重新序列化为JSON。相反,仅当它表示字符串或整数等基本值时,才会将该
JToken
转换为字符串。如果要将
数组[0]
重新序列化为JSON,则需要使用如下方法:

if (array.Count > 0 && array[0].ToString(Formatting.None) == "\"error\"")
{
    // Process an error response                
}
else // Continue as before
{
}
但是,这将比简单地检查类型具有更差的性能


示例。

对于正常内容和错误内容,最好具有相同的结构。到目前为止,正常内容是数组的数组,而错误内容是字符串的数组。当内容是正常响应时,您试图做的是假设错误响应。
array[0]
不是字符串。这是一个内部数组。您希望如何将数组转换为字符串?我明白了。。我假设代码是API的最新版本,但事实可能并非如此。请参见编辑@艾米,我不知道Json格式,但现在我明白了,这是一个数组数组。对于正常内容和错误内容,使用相同的结构会很好。到目前为止,正常内容是数组的数组,而错误内容是字符串的数组。当内容是正常响应时,您试图做的是假设错误响应。
array[0]
不是字符串。这是一个内部数组。您希望如何将数组转换为字符串?我明白了。。我假设代码是API的最新版本,但事实可能并非如此。请参见编辑@Amy,我不知道Json格式,但现在我明白了这是一个数组数组。感谢测试类!我没有正确的测试,所以这是一个良好的开始,为更好的习惯。感谢测试类!我没有正确的测试,所以这是一个良好的开始,为更好的习惯。