#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. Но это сработало