当返回的值可以是数组或单个项目时,无法反序列化当前 JSON 数组



我是Newtonsoft.Json的新手,所以请原谅我的无知 - 但是在尝试将以下Json反序列化为c#对象或手动时,我遇到了这个问题。

Json是

{
  "travellerInfo": [
    {
      "passengerData": {
        "travellerInformation": {
          "passenger": [
            {
              "type": "ADT",
              "firstName": "MARY MRS"
            },
            {
              "type": "INF",
              "firstName": "JOSHUA"
            }
          ],
          "traveller": {
            "surname": "SMITH",
            "quantity": "2"
          }
        }
      }
    },
    {
      "passengerData": {
        "travellerInformation": {
          "passenger": {
            "type": "ADT",
            "firstName": "JOHN MR"
          },
          "traveller": {
            "surname": "SMITH",
            "quantity": "1"
          }
        }
      }
    }
  ]
}
如您所见,在第一个"乘客"项上,它作为数组返回,

但是在第二个"乘客"项上,它不作为数组返回,只是一个块。 我无法控制发送给我的 Json - 它来自外部系统。 我的 C# 类是

public class Passenger
{
    public string type { get; set; }
    public string firstName { get; set; }
}
public class Traveller
{
    public string surname { get; set; }
    public string quantity { get; set; }
}
public class TravellerInformation
{
    public List<Passenger> passenger { get; set; }
    public Traveller traveller { get; set; }
}
public class PassengerData
{
    public TravellerInformation travellerInformation { get; set; }
}
public class TravellerInfo
{
   public PassengerData passengerData { get; set; }
}

我打电话

var example = JsonConvert.DeserializeObject<TravellerInfo>(jsonString);

我收到错误

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Script1.TravellerInfo' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'travellerInfo', line 57, position 20. 

我尝试在 Passenger 类上放置一个 [JsonArray] 属性以强制它反序列化为数组/列表,但发生了同样的错误,因为我认为底层项目是 JProperty 而不是 JObject。

那么,当 ["乘客"] 可以同时作为数组和单个对象返回时,我如何让它工作?

提前欢呼

您可以尝试将其反序列化为 dynamic,然后对类型进行一些检查。检查是否is IEnumerable

这应该可以完成这项工作。

试试这个。将List<Passenger>替换为TravellerInformation中的object passenger

public class Traveller
{
    public string surname { get; set; }
    public string quantity { get; set; }
}
public class TravellerInformation
{
    public object passenger { get; set; }
    public Traveller traveller { get; set; }
}
public class PassengerData
{
    public TravellerInformation travellerInformation { get; set; }
}
public class TravellerInfo
{
    public PassengerData passengerData { get; set; }
}

并通过传递List<TravellerInfo>而不是TravellerInfo来调用它:

var example = JsonConvert.DeserializeObject<List<TravellerInfo>>(jsonString);

此外,对于这些情况,您可以使用此服务,该服务会自动从 JSON 对象创建 C# 类,因此您不必担心正确性。

相关内容

  • 没有找到相关文章

最新更新