【问题标题】:Deserialize JSON into readable format将 JSON 反序列化为可读格式
【发布时间】:2018-09-15 01:48:24
【问题描述】:

我现在正在处理一个 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;
}

用户界面

listView.ItemsSource = await App.TodoManager.GetTasksAsync();

更新

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

【问题讨论】:

  • 你不需要另一个模型类来跟踪这个键user吗?
  • 在尝试反序列化之前,'content' 变量的实际字符串内容是什么?
  • @RomeoSierra 是吗?它们必须是相同的名称或不同的可以吗?
  • @AppPack 让我为你更新
  • 是来自您拥有的 api 吗?它不是您期望的项目列表格式。这就是它无法反序列化的原因

标签: c# json firebase xamarin firebase-realtime-database


【解决方案1】:

这更像是对Evk's answer 的补充。

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

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; }
}

【讨论】:

    【解决方案2】:

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

    所以你需要将它反序列化为字典:

    JsonConvert.DeserializeObject<Dictionary<string, TodoItem>>(content);
    

    如果您不关心那些神秘的属性名称,您可以这样做:

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

    【讨论】:

    • 不知道Dictionary 功能.. 非常感谢,花了我半天的时间来破解这个。
    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2011-08-14
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多