C# 将JSON反序列化为可读格式

C# 将JSON反序列化为可读格式,c#,json,firebase,xamarin,firebase-realtime-database,C#,Json,Firebase,Xamarin,Firebase Realtime Database,我现在正在从事一个Xamarin项目,我正在使用Firebase作为我的数据库 我有一组数据如下: 我已经设法通过RESTful服务检索数据。但是,当我尝试jsonvert.Deserialize它们时,我遇到一个错误,告诉我无法转换为.NET Collection 有什么办法我能做到吗 我的模型 public class TodoItem { public string ID { get; set; } public string Name { get; set; }

我现在正在从事一个Xamarin项目,我正在使用Firebase作为我的数据库

我有一组数据如下:

我已经设法通过RESTful服务检索数据。但是,当我尝试
jsonvert.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;
}
更新

变量
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\"}}

正如您从第一个屏幕截图和json字符串中所看到的,您收到的json实际上并不代表一个集合。它是一个具有神秘属性的对象,每个属性代表一个待办事项

因此,您需要将其反序列化为字典:

JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content);
JsonConvert.DeserializeObject(内容);
如果您不在乎那些神秘的属性名称,您可以:

Items = JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content).Values.ToList()
Items=JsonConvert.DeserializeObject(content.Values.ToList())

正如您从第一个屏幕截图和json字符串中看到的,您收到的json实际上并不代表一个集合。它是一个具有神秘属性的对象,每个属性代表一个待办事项

因此,您需要将其反序列化为字典:

JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content);
JsonConvert.DeserializeObject(内容);
如果您不在乎那些神秘的属性名称,您可以:

Items = JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content).Values.ToList()
Items=JsonConvert.DeserializeObject(content.Values.ToList())

这更像是对的补充

为了简洁起见,我冒昧地缩小了示例数据集。我已经验证了这个小示例的功能

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; }
}
类程序
{
静态void Main(字符串[]参数)
{
var JSONStr=“{\'user\':{\'L9k0\':{\'ID\':\'001\',\'name\':\'somename\',\'L9k1\':{\'ID\':\'002\',\'name\':\'someothername\'}”;
var res=JsonConvert.DeserializeObject(JSONStr);
Console.ReadLine();
}
}
类JsonResult{
公共字典用户{get;set;}
}
类ToDoItem{
公共字符串ID{get;set;}
公共字符串名称{get;set;}
}

这更像是对的补充

为了简洁起见,我冒昧地缩小了示例数据集。我已经验证了这个小示例的功能

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; }
}
类程序
{
静态void Main(字符串[]参数)
{
var JSONStr=“{\'user\':{\'L9k0\':{\'ID\':\'001\',\'name\':\'somename\',\'L9k1\':{\'ID\':\'002\',\'name\':\'someothername\'}”;
var res=JsonConvert.DeserializeObject(JSONStr);
Console.ReadLine();
}
}
类JsonResult{
公共字典用户{get;set;}
}
类ToDoItem{
公共字符串ID{get;set;}
公共字符串名称{get;set;}
}

您是否需要另一个模型类来跟踪此键
用户
?在“content”变量尝试反序列化之前,“content”变量的实际字符串内容是什么?@RomeoSierra我需要吗?它们必须是相同的名称或不同的名称,可以吗?@AppPack让我为您更新它是来自您自己的api吗?它的格式与您期望的项目列表格式不同。这就是它无法反序列化的原因。您是否需要另一个模型类来跟踪此键
用户
?在尝试反序列化之前,“content”变量的实际字符串内容是什么?@RomeoSierra I?它们必须是相同的名称或不同的名称,可以吗?@AppPack让我为您更新它是来自您自己的api吗?它的格式与您期望的项目列表格式不同。这就是它无法反序列化的原因,因为它不知道
字典
功能。。非常感谢,我花了半天的时间试图破解这个。我不知道
字典的功能。。非常感谢你,我花了半天的时间试图破解这个。