Member 14178219 Ответов: 3

Не может десериализовать JSON-объект тока (например, {"имя":"значение"}) в тип System.коллекции.универсальный.список`1...


Здравствуйте, я получаю такой JSON и хочу десериализовать его в свой объект C#.

JSON (частично):

{
    "Quotes": [
        {
            "QuoteId": 1,
            "MinPrice": 119,
            "Direct": true,
            "OutboundLeg": {
                "CarrierIds": [
                    851
                ],
                "OriginId": 81727,
                "DestinationId": 60987,
                "DepartureDate": "2019-04-01T00:00:00"
            },
            "QuoteDateTime": "2019-03-10T19:27:00"
        }
    ],
    "Places": [
        {
            "PlaceId": 60987,
            "IataCode": "JFK",
            "Name": "New York John F. Kennedy",
            "Type": "Station",
            "SkyscannerCode": "JFK",
            "CityName": "New York",
            "CityId": "NYCA",
            "CountryName": "United States"
        },
        {
            "PlaceId": 81727,
            "IataCode": "SFO",
            "Name": "San Francisco International",
            "Type": "Station",
            "SkyscannerCode": "SFO",
            "CityName": "San Francisco",
            "CityId": "SFOA",
            "CountryName": "United States"
        }
    ]   
}


Мой класс:
public class MyQuotes

    {
        public List<Quote> Quotes { get; set; }
        public List<Place> Places { get; set; }
    }

    public class Quote
    {
        public int QuoteId { get; set; }
        public List<MyOutboundLeg> OutboundLeg { get; set; }
    }

    public class MyOutboundLeg
    {
        public List<int> CarrierIds { get; set; }
        public int OriginId { get; set; }
    }

    public class Place
    { 
        public string PlaceId { get; set; }
        public string CountryName { get; set; }
    }
    
    }


Что я уже пробовал:

var body = ApiTestContext.Response.Content.ReadAsStringAsync().Result;
            MyQuotes myQuotes = JsonConvert.DeserializeObject<MyQuotes>(body);

3 Ответов

Рейтинг:
27

#realJSOP

Разве не все поля в json должны присутствовать в классе, и разве все они не должны быть названы одинаково в JSON и классе? Как еще он сможет сериализоваться?

Вы пропускаете поля в определении класса, и одно из полей не имеет того же имени, что и в данных json (именно здесь происходит исключение - JSON имеет "имя", а ваш класс - "имя места").


Member 14178219

Спасибо, я переименовал поле "PlaceName", но, как я знаю, не все поля из JSON должны присутствовать в классе, а только те поля, которые я хочу использовать позже. И я все еще получаю ту же ошибку

Рейтинг:
17

OriginalGriff

Это потому, что ваш JSON не соответствует вашим определениям классов.
Попробуйте онлайн-генератор (вот тот, который я использую: json2csharp - генерация классов c# из json[^] ) и вы получаете это:

public class OutboundLeg
{
    public List<int> CarrierIds { get; set; }
    public int OriginId { get; set; }
    public int DestinationId { get; set; }
    public DateTime DepartureDate { get; set; }
}

public class Quote
{
    public int QuoteId { get; set; }
    public int MinPrice { get; set; }
    public bool Direct { get; set; }
    public OutboundLeg OutboundLeg { get; set; }
    public DateTime QuoteDateTime { get; set; }
}

public class Place
{
    public int PlaceId { get; set; }
    public string IataCode { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public string SkyscannerCode { get; set; }
    public string CityName { get; set; }
    public string CityId { get; set; }
    public string CountryName { get; set; }
}

public class RootObject
{
    public List<Quote> Quotes { get; set; }
    public List<Place> Places { get; set; }
}


Member 14178219

спасибо, я изменю код, можно спросить, обязательно ли использовать все поля? Я имею в виду что раньше я использовал только некоторые поля которые буду использовать и для других тестов это работало

OriginalGriff

Вам не обязательно иметь все поля в классе в JSON, но вы должны иметь все поля в JSON в классе.
Это хорошая идея, чтобы иметь точное совпадение, так что вы не получите будущих проблем совместимости.

Member 14178219

спасибо

OriginalGriff

Всегда пожалуйста!

Рейтинг:
12

Wastedtalent

Ваш класс исходящей ноги-это свойство в вашем JSON, но список в вашем классе котировок:

public class Quote
    {
        public int QuoteId { get; set; }
        public List<MyOutboundLeg> OutboundLeg { get; set; }
    }


Должно быть:

public class Quote
    {		
        public int QuoteId { get; set; }
        public MyOutboundLeg OutboundLeg { get; set; }
    }


Member 14178219

спасибо