Сейчас я работаю над проектом Xamarin и использую Firebase в качестве базы данных.
У меня есть следующий набор данных:
Мне удалось получить данные через службу RESTful. Однако, когда я попытался их преобразовать в JsonConvert.Deserialize, я столкнулся с ошибкой, сообщающей мне, что я не могу преобразовать их в .NET Collection.
Как я могу это сделать?
Моя модель
public class TodoItem
{
public string ID { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
public bool Done { get; set; }
}
Получение из службы RESTful
public async Task<List<TodoItem>> RefreshDataAsync()
{
Items = new List<TodoItem>();
//RestUrl = refer to constants.cs
var uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
var response = await client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
Items = JsonConvert.DeserializeObject<List<TodoItem>>(content);
}
}
catch (Exception ex)
{
Debug.WriteLine(@" ERROR{0}", ex.Message);
}
return Items;
}
UI
listView.ItemsSource = await App.TodoManager.GetTasksAsync();
Update
Что в содержимом переменной content
{\"-L9K-8AF9fxZfe6bwTjk\":{\"Done\":false,\"ID\":\"323642ac-89e2-4f14-b9b0-e9b7306aee81\",\"Name\":\"ufhd\",\"Notes\":\"nvnv\"},\"-L9K07oNjtvPQYbdyItU\":{\"Done\":false,\"ID\":\"c7a53ad2-533f-454c-9ac0-5b21c3d2669c\",\"Name\":\"abc\",\"Notes\":\"cde\"},\"-L9K1n1r7Q7ZIgA3KFaD\":{\"Done\":false,\"ID\":\"938bd62f-f117-4733-a1e4-a4ed22233ca3\",\"Name\":\"ffef\",\"Notes\":\"dfg\"}}
каково фактическое строковое содержимое переменной content до того, как она попытается десериализоваться?
@RomeoSierra не так ли? У них должно быть одно и то же имя или разные, нормально?
@AppPack Позвольте мне обновить для вас
это исходит от вашего собственного api? это не в том формате, который вы ожидаете от списка элементов. поэтому он не может десериализовать
@AppPack Я просто следил за инструкцией от Xamarin, docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/…, но это не могло сработать, поэтому мне пришлось спросить здесь ..
о да, Ромео был прав, тебе нужно создать учетную запись для пользователя
@AppPack aite, я дам вам сдачу и сообщу вам обо всех изменениях.





Как видно из первого снимка экрана и из строки json, полученный файл json на самом деле не представляет собой коллекцию. Это объект с загадочными свойствами, каждое свойство представляет собой одно задание.
Поэтому вам нужно десериализовать его как словарь:
JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content);
Если вас не интересуют эти загадочные имена свойств, вы можете сделать:
Items = JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content).Values.ToList()
Не знал о функции Dictionary ... большое вам спасибо, потратил полдня, пытаясь взломать это.
Это скорее дополнение к Эвк ответ.
Я взял на себя смелость минимизировать ваш пример набора данных для краткости. Этот небольшой пример, который я проверил на предмет функциональности.
class Program
{
static void Main(string[] args)
{
var JSONStr = "{\"user\":{\"L9k0\":{\"ID\":\"001\", \"name\":\"somename\"},\"L9k1\":{\"ID\":\"002\", \"name\":\"someothername\"}}}";
var res = JsonConvert.DeserializeObject<JsonResult>(JSONStr);
Console.ReadLine();
}
}
class JsonResult {
public Dictionary<string, ToDoItem> user { get; set; }
}
class ToDoItem {
public string ID { get; set; }
public string name { get; set; }
}
Разве вам не нужен другой класс модели, который отслеживает этот ключевой
user?