2017-02-14 9 views
1

Я новичок в Newtonsoft.Json, поэтому, пожалуйста, извините мое невежество - однако я придумываю эту проблему при попытке Deserialize следующего Json либо aC# объект или действительно вручную.Невозможно десериализовать текущий массив JSON, когда возвращаемое значение может быть либо массивом, либо отдельным элементом.

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

Так как вы можете видеть, по первому вопросу «пассажира», это возвращается как массив, однако по второму вопросу «пассажирской», он не возвращает в качестве массив, всего один блок. Я не контролирую, что меня послал Джон, - он поступает из внешней системы. Мои 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. 

Я попытался положить [JsonArray] атрибут класса Passenger, чтобы заставить его deserialise как массив/список, но такая же ошибка произошла, поскольку я думаю, что базовый элемент - это JProperty, а не JObject.

Как я могу заставить это работать, когда ["пассажир"] может возвращаться как объект Array и Single?

Cheers in Advance

+0

Я бы посоветовал вам использовать [Json 2 C#] (http://json2csharp.com/) веб для создания ваших классов или вставить специальные в Visual Studio – Pikoh

+1

Очевидно, что объект travellerInformation не может иметь как пассажира свойство как один экземпляр ** и ** и массив. Я думаю, что в этом случае я попытаюсь изменить Json (это строка, в конце концов), чтобы свойство «**» всегда было массивом. Так найдите способ добавить квадратные скобки, если необходимо? Вот ответ на Java: http://stackoverflow.com/questions/21063367/jackson-mapping-object-or-list-of-object-depending-on-json-input – Oxonhammer

+0

'Пассажир' не имеет ничего общего с ошибкой вы показываете, что это связано с массивом «TraverInfo», который вы пытаетесь передать в объект «TraverInfo». Помимо этого, если вы контролируете создание данных, измените пассажира всегда на массив с 1 или больше записей. Если нет, вы можете написать картографу со стороны скрипта, чтобы «исправить» это, обернув один объект в массив перед его отправкой? – Nope

ответ

0

Попробуйте это. Заменить List<Passenger> с object passenger в 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; } 
} 

И называют это пропусканием List<TravellerInfo> вместо TravellerInfo:

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

Кроме того, для этих случаев вы можете использовать этот service, который автоматически создает классы C# из объектов JSON, так вам не нужно беспокоиться о правильности.

+0

Я использовал Json 2 C# для создания классов - однако для поднятия этого вопроса я показал только конкретный раздел, который вызывал проблему. В верхней части Json есть один элемент [«response»] - извините, если это вызвало некоторую путаницу. –

+0

Спасибо, что выбрали List . Я не понимал, что это может быть также массив или отдельный элемент в Json. Поэтому я изменил его на List в классе Response - и, похоже, он исправил это, но теперь ошибка относится только к списку - я попытался изменить этот объект, но произошла одна и та же ошибка –

+0

Извините, не мог понять последнее предложение. Остается ли проблема обнаружить, является ли тип 'object'' List '' или 'Passenger' для его преобразования? Если да, то я думаю, что у меня есть решение –

0

Вы можете попробовать десериализовать его как dynamic, а затем выполнить некоторые проверки типов. Проверьте, is IEnumerable.

Это должно выполнить эту работу.