我有一个问题,我不知道如何解决。
我有一个 object Movimientos
,在调用 ApiRest 之后,我得到了它们的列表,我将其反序列化如下。
result = JsonConvert.DeserializeObject<List<Movimientos>>(contenido);
到目前为止完美,问题是当我对 Api 的调用仅返回aMovimiento
时,相同的反序列化行会跳过:
{"无法将当前 JSON 对象(例如 {\"name\":\"value\"})反序列化为类型 'System.Collections.Generic.List`1[Moves]',因为该类型需要 JSON 数组(例如 [ 1,2,3]) 以正确反序列化。\r\n要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或将反序列化类型更改为正常的 .NET 类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型)可以从 JSON 对象反序列化。也可以将 JsonObjectAttribute 添加到类型以强制它从 JSON 对象反序列化。“}
如何使其与包含列表和单个项目的 json 一起使用?
我使用更简化的数据进行编辑: api 返回的示例 json 是
string contenido = "{ \"NumeroOrden\":null,\"Operacion\":null}";
还有运动课
public class Movimientos
{
public string NumeroOrden { get; set; }
public string Operacion { get; set; }
}
编辑:我得到的 Json必须是不可变的。api 返回的不是我的,它不依赖于我,因此不能修改。
由于您无法修改 REST API(正如您在评论中指出的那样),因此您必须控制代码,以检查 Web API 返回的是数组还是简单的对象。
您可以通过多种方式做到这一点,我指出两种:
1 -通过异常(Try/Catch)
2 -检查它是否是数组(以'['开始并以']'结束)
当然,这只是两种指示性方法(可改进),现在这一切都取决于您的应用程序和您的编程水平。
更新:
根据您的评论:
实际上,不建议对条件控制流使用通用异常。但是在某些情况下(例如您的情况),无法纠正的不良编程(例如您使用的 Web API)需要非正统的方法来解决问题。有时(但并非总是)目的证明手段是正当的。
正如我在评论中告诉您的那样,您可以执行以下操作:
添加
try catch
在您执行代码的内部,该try
代码验证对象中是否有多个元素没有任何反应,它返回正常,但如果只有一个元素出现,您将生成一个错误,您将在其中验证catch
您将放入代码你只反序列化一个对象。