【问题标题】:JArray.Load, not loading array? wrong format?JArray.Load,不加载数组?格式错误?
【发布时间】:2017-10-24 19:12:15
【问题描述】:

试图让这个 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 新手,因此阅读器内容可能存在基本格式问题。似乎这个字符串没有转换为数组,因此 array[0] 包含一个数组..?

编辑:

进一步考虑,我推测 API 内容格式可能已经改变。以防万一,这似乎可以在错误响应的第一个元素处检查“错误”:

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

【问题讨论】:

  • 正常内容和错误内容具有相同的结构会很好。截至目前,正常内容是数组的数组,而错误内容是字符串数组。当内容是正常响应时,您要做的是假设错误响应。
  • array[0] 不是字符串。这是一个内部数组。您希望如何将数组转换为字符串?
  • 我明白了。我认为代码是最新的 API,但当然可能不是这样。见编辑。 @Amy,我不知道 Json 格式,但现在我知道这是一个数组数组。

标签: c# .net json json.net


【解决方案1】:

当响应有效时,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 类型JArrayJValue

您在表达式 (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

【讨论】:

  • 欣赏测试课!我没有正确测试,所以这是一个更好的习惯的良好开端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2016-07-04
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多