2009-03-06 12 views
7

Để trả lời câu hỏi tôi đã hỏi cách đây vài ngày, tôi đang cố gắng kéo dài một chút và làm điều gì đó mà trước đây tôi chưa thực sự tập trung. Tôi đã thực hiện một số tìm kiếm (cả ở đây, và nói chung), nhưng không thể tìm thấy câu trả lời (hoặc thậm chí gợi ý hợp lý) cho những gì tôi muốn đạt được (mặc dù, một vài điều đến gần-ish).Deserializing Chrome Đánh dấu dữ liệu JSON trong C#

Về cơ bản, tôi đang cố gắng deserialize dữ liệu cho tệp dấu trang Google Chrome bằng cách sử dụng Json.NET library (mặc dù, nếu có một lựa chọn tốt hơn, tôi là tất cả cho điều đó - tài liệu cho thư viện này là một chút bối rối ở những nơi). Tôi hơi bối rối khi bước tiếp theo cần thực hiện, chủ yếu là được sử dụng để xử lý dữ liệu JSON tuyệt vời của PHP (sử dụng json_decode()), cho phép thực hiện một cuộc gọi hàm đơn giản và sau đó truy cập mảng liên kết đơn giản.

Thư viện (Json.NET) muốn tôi chỉ định loại đối tượng có thể deserialize dữ liệu JSON vào, nhưng tôi không thực sự chắc chắn làm thế nào để đi về cấu trúc như một đối tượng, cho định dạng của các tập tin Bookmarks chinh no. Định dạng là một cái gì đó dọc theo dòng:

{ 
    "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 
} 

Bây giờ, trong PHP, tôi muốn được xa được sử dụng nhiều để làm một cái gì đó dọc theo dòng sau đây, để có được những dữ liệu tôi muốn, và kết thúc với ' Json.NET ':

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

tôi có thể làm việc ra, chỉ đơn giản là đủ, những gì đối tượng để tạo ra để đại diện cho dữ liệu (một cái gì đó giống như một đối tượng gốc, sau đó một đối tượng danh sách bookmark, và cuối cùng là một đối tượng đánh dấu cá nhân) - nhưng Tôi thực sự không chắc chắn làm thế nào để thực hiện chúng, và sau đó nhận được thư viện để deserialize vào các đối tượng có liên quan một cách chính xác.

Bất kỳ lời khuyên nào có thể được cung cấp sẽ được đánh giá cao.

+0

Tôi đồng ý, C# nên có 1 chức năng JSON đọc. – Qwertie

Trả lời

12

Nó không phải là cần thiết để khai báo một loại phản ánh cấu trúc 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); 
     } 
    } 
+0

Sẽ không biên dịch. Tôi nghĩ bạn có ý định sử dụng JsonTextReader để thay thế. –

+0

Ngoài ra, tôi không thể tìm thấy bất kỳ điều gì về JavaScriptObject, không gian tên nào là một phần của nó? Google nhanh chóng không có gì cụ thể. –

+0

Xin lỗi, tôi đang sử dụng phiên bản cũ của hội đồng Json.NET. Tôi thấy rằng API đã thay đổi kể từ đó. Tôi sửa đổi bài viết của tôi cho phù hợp –