перебор объекта JSON при добавлении каждой записи в список c#

#c# #xamarin

#c# #xamarin

Вопрос:

Я немного новичок в c #, и я пытаюсь добавить все записи, которые я возвращаю обратно из своего веб-сервиса, и добавить их в назначенный список. Мой JSON выглядит примерно так:

 {
  
 "errMsg":"",
   "date":"2020-10-21 10:20:28",
   "Category":
   [{"iCatID":"1","sDescription":"All},{"iCatID":"2","sDescription":"All Vegetables"},....],
 "Product":
   [{"iProductID":"10","sDescription":"Apples},   {"iProductID":"11","sDescription":"All Vegetables"},....]
}
  

Оба продукта и категории возвращают несколько продуктов 100 или 1000. Пока у меня есть это, чтобы попытаться перебрать их и добавить в их собственный список, чтобы затем добавить оба списка в две локальные таблицы, которые у меня есть в моем приложении под названием Product и Category .

Я явно делаю что-то не так, потому что мой текущий код не работает. частный список _product = новый список(); частный список _category = новый список();

 public async void CreateLocalTables()    
{

try
          {
            _client.GetAsync("https://app.spcty.com/app/dbExport.php");
                var content = await response.Content.ReadAsStringAsync();
                dynamic data = JsonConvert.DeserializeObject(content);

             foreach (var obj in data.Product)
              {
                  Console.WriteLine(obj);
                  //does not work
                  _product.Add(obj)
              }
}
  

Моя ошибка заключается в следующем Microsoft.CSharp.RuntimeBinder.Исключение RuntimeBinderException: наилучший перегруженный метод соответствует ‘System.Коллекции.Generic.ListМодели.Категория>.Добавить(проект.Модели.Категория)’ имеет некоторые недопустимые аргументы

Я проверил свой класс Category и думаю, у меня есть все, что мне нужно.

 public class Category
    {

        [PrimaryKey]
        public int iCatID { get; set; }
        public string sDescription { get; set; }
}
  

Я не понимаю, что он говорит о недопустимых аргументах. Я получаю это как для категории, так и для продукта. Какие-либо рекомендации?
РЕДАКТИРОВАТЬ: я также пробовал это с помощью RootObject, я просто не знал, как получить доступ к спискам продуктов и категорий оттуда:

 public class RootObject
{
    public  List<Category> CategoyItems { get; set; }

    public List<Product> ProductItems { get; set; }
    public string errMsg { get; set; }
    public string date { get; set; }            
}
  

Я добавил еще две вещи как к JSON, так и к RootObject.

Комментарии:

1. Привет, не могли бы вы показать пример данных содержимого response.Content.ReadAsStringAsync() ? Я проверю структуру данных.

2. это очень долго, но да, давайте посмотрим, смогу ли я вам это дать

3. @JuniorJiang-MSFT Я добавил больше своего JSON, а также кое-что добавил к нему, надеюсь, это даст вам лучшее описание.

4. Окей, спасибо за обновление. Если вы решили эту проблему, не забудьте отметить ответ, когда у вас будет время. Другим людям будет полезно узнать решение.

Ответ №1:

вам необходимо десериализовать ваши данные в конкретный тип

 var data = JsonConvert.DeserializeObject<RootObject>(content);

foreach(var obj in data.ProductItems)
{
  _product.Add(obj);
}
  

Комментарии:

1. но мои данные JSON также включают категорию. Я извлекаю сразу несколько массивов. Один из них — Product, а другой — Category, поэтому я попытался использовать dynamic.

2. хорошо, как ни странно, теперь я получаю эту ошибку System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта в строке «foreach(var obj в данных. ProductItems) «. Вы знаете, почему это может быть?

3. Потому что ProductItems имеет значение null. В вашем JSON нет ничего с таким именем, поэтому, если у вас нет атрибута сопоставления, он не будет десериализован правильно

4. ах, я понимаю. Хорошо, я это исправил. Я думаю, что сейчас я на правильном пути, потому что теперь я получаю эту ошибку, не могу десериализовать текущий объект JSON (например, {«name»:»value»}) в тип ‘System. Коллекции. Generic.List`1[SPRecipeApp2020. Модели. Category_Type]’ потому что для правильной десериализации типа требуется массив JSON (например, [1,2,3] ) . Я уже сталкивался с этой ошибкой раньше, поэтому я углублюсь в нее

5. еще раз спасибо за помощь. У меня были некоторые проблемы с моим JSON. Но это сработало