Создание списка объектов, заполненных данными SOAP API, приводит к исключению «Индекс вне диапазона» - PullRequest
0 голосов
/ 28 октября 2019

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

public void WriteXML()
        {
            var results = GetProductsFromApi().results.ToList();
            using (var file = File.Create(@"products.xml"))
            {
                var list = new List<Product>();
                var writer = new XmlSerializer(typeof(List<Product>));
                foreach (var result in results)
                {
                    var newProduct = new Product
                    {
                        Id = result.productId,
                        Index = result.productDisplayedCode,
                        Stock = result.productStocksData.productStocksQuantities[0].productSizesData[0].productSizeQuantity,
                        IsIgnored = false,
                        IsInDelivery = false
                    };
                    list.Add(newProduct);
                }
                writer.Serialize(file, list);
            }
        }

Я сделал запрос к API и хочу сохранить его в списке, поэтомукаждый результат сериализуется в XML позже. Приведенный выше код работает, если я установлю Stock на что-то вроде Stock = 1, - однако, если оставить все как есть, программа закроется с Unhandled exception: System.IndexOutOfRangeException.

Что странно, если я сделаю что-то похожее наперед построением объекта Product:

Console.WriteLine(result.productStocksData.productStocksQuantities[0].productSizesData[0].productSizeQuantity);

... Я получил правильный ответ API.

Понятия не имею, что происходит. Я пытался проверить, равен ли результат null перед построением Product, но это не помогло. Всё исключение настолько сбивает меня с толку, что я не знаю, с чего начать.

Редактировать : используя предложенный Fildor код, я написал следующее:

    float? lol = result.productStocksData.productStocksQuantities.FirstOrDefault().productSizesData.FirstOrDefault()?.productSizeQuantity ?? null; //doesn't actually change anything if it's null or 0
    if (lol.GetValueOrDefault() == 0) {
        lol = 1;
    };

    var newProduct = new Product
    {
        Id = result.productId,
        Index = result.productDisplayedCode,
        Stock = (float)lol,
        IsIgnored = false,
        IsInDelivery = false
    };
    Console.WriteLine("Processed product has a stock of " + lol);
    list.Add(newProduct);

Теперь это приводит к System.NullReferenceException. Он отвечает с реальным размером запаса, и указанная ошибка появляется после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...