Cannot deserialize the current JSON array when returned value can be either array or single item

こ雲淡風輕ζ 提交于 2019-12-11 07:18:39

问题


I am new to Newtonsoft.Json so please excuse my ignorance - however I am coming up against this issue when trying to Deserialize the following Json to either a c# object or indeed manually.

The Json is

{
  "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"
          }
        }
      }
    }
  ]
}

So as you can see, on the first 'passenger' item, this returns as an Array, however on the second 'passenger' item, it doesn't return as an array, just a single block. I am not in control of the Json being sent to me - it comes from an external system. My C# classes are

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; }
}

and I call

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

I am getting the error

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. 

I tried putting a [JsonArray] attribute on the Passenger class to force it to deserialise as an array/list, but same error occured as I think the underlying item is a JProperty instead of a JObject.

So how can I get this to work when the ["passenger"] can come back as both an Array and Single object ?

Cheers in Advance


回答1:


You can try deserialize it as dynamic and then do some checks to types. Check if it is IEnumerable.

That should do the job.




回答2:


Try this. Replace List<Passenger> with object passenger in TravellerInformation:

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; }
}

And call this by passing List<TravellerInfo> instead of TravellerInfo:

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

Also for these cases you can use this service which automatically creates C# classes from JSON objects, so you don't have to worry about correctness.



来源:https://stackoverflow.com/questions/42230008/cannot-deserialize-the-current-json-array-when-returned-value-can-be-either-arra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!