Я новичок в 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
Я бы посоветовал вам использовать [Json 2 C#] (http://json2csharp.com/) веб для создания ваших классов или вставить специальные в Visual Studio – Pikoh
Очевидно, что объект travellerInformation не может иметь как пассажира свойство как один экземпляр ** и ** и массив. Я думаю, что в этом случае я попытаюсь изменить Json (это строка, в конце концов), чтобы свойство «**» всегда было массивом. Так найдите способ добавить квадратные скобки, если необходимо? Вот ответ на Java: http://stackoverflow.com/questions/21063367/jackson-mapping-object-or-list-of-object-depending-on-json-input – Oxonhammer
'Пассажир' не имеет ничего общего с ошибкой вы показываете, что это связано с массивом «TraverInfo», который вы пытаетесь передать в объект «TraverInfo». Помимо этого, если вы контролируете создание данных, измените пассажира всегда на массив с 1 или больше записей. Если нет, вы можете написать картографу со стороны скрипта, чтобы «исправить» это, обернув один объект в массив перед его отправкой? – Nope