c# - 在 C# 中反序列化 Chrome 书签 JSON 数据

标签 c# .net json google-chrome json.net

为了回答我几天前提出的一个问题,我正试图让自己稍微舒展一下,做一些我以前没有真正关注过的事情。我已经进行了一些搜索(在这里和一般情况下),但找不到我想要实现的目标的答案(甚至合理的提示)(尽管有一些事情很接近)。

基本上,我正在尝试使用 Json.NET library 反序列化 Google Chrome 书签文件的数据。 (不过,如果有更好的选择,我完全赞成——这个库的文档在某些地方有点困惑)。对于要采取的下一步,我有点困惑,主要是因为习惯了 PHP 对 JSON 数据的出色处理(使用 json_decode() ),允许单个函数调用,然后进行简单的关联数组访问。

库 (Json.NET) 希望我指定一个对象类型,它可以将 JSON 数据反序列化为该类型,但鉴于书签文件本身的格式,我不确定如何构建这样一个对象.格式类似于:

{
   "roots": {
      "bookmark_bar": {
         "children": [ {
            "children": [ {
               "date_added": "12880758517186875",
               "name": "Example URL",
               "type": "url",
               "url": "http://example.com"
            }, {
               "date_added": "12880290253039500",
               "name": "Another URL",
               "type": "url",
               "url": "http://example.org"
            } ],
        "date_added": "12880772259603750",
            "date_modified": "12880772452901500",
            "name": "Sample Folder",
            "type": "folder"
         }, {
            "date_added": "12880823826333250",
            "name": "Json.NET",
            "type": "url",
            "url": "http://james.newtonking.com/pages/json-net.aspx";
         } ],
         "date_added": "0",
         "date_modified": "12880823831234250",
         "name": "Bookmarks bar",
         "type": "folder"
      },
      "other": {
         "children": [  ],
         "date_added": "0",
         "date_modified": "0",
         "name": "Other bookmarks",
         "type": "folder"
      }
   },
   "version": 1
}

现在,在 PHP 中,我更习惯于按照以下方式做一些事情,以获取我想要的数据,并以“Json.NET”结尾:

$data['roots']['bookmark_bar']['children'][0]['name'];

我可以很简单地计算出要创建哪些对象来表示数据(类似于根对象,然后是书签列表对象,最后是单个书签对象)——但我真的不确定如何实现它们,然后让库正确反序列化为相关对象。

如能提供任何建议,我们将不胜感激。

最佳答案

没有必要声明一个反射(reflect)json结构的类型:

    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using System.IO;
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            string json = 
@"
{
   ""roots"": {
      ""bookmark_bar"": {
         ""children"": [ {
            ""children"": [ {
               ""date_added"": ""12880758517186875"",
               ""name"": ""Example URL"",
               ""type"": ""url"",
               ""url"": ""http://example.com""
            }, {
               ""date_added"": ""12880290253039500"",
               ""name"": ""Another URL"",
               ""type"": ""url"",
               ""url"": ""http://example.org""
            } ],
        ""date_added"": ""12880772259603750"",
            ""date_modified"": ""12880772452901500"",
            ""name"": ""Sample Folder"",
            ""type"": ""folder""
         }, {
            ""date_added"": ""12880823826333250"",
            ""name"": ""Json.NET"",
            ""type"": ""url"",
            ""url"": ""http://james.newtonking.com/pages/json-net.aspx""
         } ],
         ""date_added"": ""0"",
         ""date_modified"": ""12880823831234250"",
         ""name"": ""Bookmarks bar"",
         ""type"": ""folder""
      },
      ""other"": {
         ""children"": [  ],
         ""date_added"": ""0"",
         ""date_modified"": ""0"",
         ""name"": ""Other bookmarks"",
         ""type"": ""folder""
      }
   },
   ""version"": 1
}
";
        using (StringReader reader = new StringReader(json))
        using (JsonReader jsonReader = new JsonTextReader(reader))
        {
            JsonSerializer serializer = new JsonSerializer();
            var o = (JToken)serializer.Deserialize(jsonReader);
            var date_added = o["roots"]["bookmark_bar"]["children"][0]["date_added"];
            Console.WriteLine(date_added);
        }
    }

关于c# - 在 C# 中反序列化 Chrome 书签 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619120/

相关文章:

android - 改造返回空响应体

c# - 为 WCF 实现接口(interface)时不能使用可选参数

c# - 按名称从列表中获取条目

c# - Windows 服务无法写入 %LOCALAPPDATA%

.net - 使用 DI 传递同一接口(interface)的多个实现

php - PHP 中的 json_encode 输出没有给数据提供标签,以便可以访问它

c# - ASP.NET MVC 5 模型绑定(bind)不起作用

c# - Linq to SQL,在 where 子句中包含重复值

c# - 从一个 API 调用返回 TitleCase JSON,其余部分使用驼峰命名法

perl - 如何访问存储在Hash中的数据