C# JArray.加载,而不是加载数组?格式错误?
正在尝试使此Bitfinex api库正常工作,但出现此异常 一个正常的反应。内容是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
[["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格式,但现在我明白了这是一个数组数组。感谢测试类!我没有正确的测试,所以这是一个良好的开始,为更好的习惯。感谢测试类!我没有正确的测试,所以这是一个良好的开始,为更好的习惯。