2009-03-06 9 views
7

W odpowiedzi na pytanie zadane kilka dni temu, staram się trochę rozciągnąć i zrobić coś, na co wcześniej nie skupiałem się zbytnio. Zrobiłem kilka wyszukiwania (zarówno tutaj, jak iw ogóle), ale nie mogę znaleźć odpowiedzi (lub nawet rozsądnych wskazówek) na to, co chcę osiągnąć (choć kilka rzeczy jest blisko).Deseryzacja Chrome Zakładka Dane JSON w języku C#

Zasadniczo próbuję deserializować dane dla pliku zakładek Google Chrome przy użyciu Json.NET library (chociaż, jeśli jest lepsza alternatywa, jestem wszystkim za to - dokumentacja dla tej biblioteki jest trochę myląca w miejscach). Jestem trochę zdezorientowany, jeśli chodzi o następny krok do podjęcia, głównie dlatego, że przyzwyczaił się on do fantastycznej obsługi danych JSON (przy użyciu json_decode()), umożliwiając wywołanie pojedynczego wywołania, a następnie prosty dostęp do tablicy asocjacyjnej.

Biblioteka (Json.NET) chce, żebym określił typ obiektu, który może deserializować dane JSON, ale nie jestem pewien, jak uzyskać strukturę takiego obiektu, biorąc pod uwagę format pliku zakładek samo. Format jest coś wzdłuż linii:

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

Teraz w PHP, byłbym znacznie bardziej przyzwyczajeni do robienia czegoś wzdłuż linii następujących, aby uzyskać dane chciałam, a kończąc na " Json.NET ':

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

mogę pracować, wystarczy po prostu, co sprzeciwia się stworzyć do reprezentowania danych (coś podobnego obiektu głównego, a następnie obiekt listy zakładek, a na końcu pojedynczy obiekt zakładka) - ale Naprawdę nie jestem pewien, jak je wdrożyć, a następnie uzyskać bibliotekę do deserializacji do odpowiednich obiektów poprawnie.

Wszelkie rady, które można zaoferować, byłyby bardzo mile widziane.

+0

zgadzam, C# powinny mieć 1-funkcyjny czytelnika JSON. – Qwertie

Odpowiedz

12

Nie jest konieczne, aby zadeklarować typ, który odzwierciedla strukturę 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

Nie skompiluje się. Myślę, że zamierzałeś użyć JsonTextReader zamiast tego. –

+0

Ponadto, nie mogę znaleźć niczego na temat JavaScriptObject, w jakim obszarze nazw jest częścią? Szybki Google nie przedstawia nic konkretnego. –

+0

Przepraszamy, używałem starej wersji zestawu Json.NET. Widzę, że API zmieniło się od tego czasu. Zmodyfikowałem swój post odpowiednio –