2009-03-06 22 views
7

Als Antwort auf eine Frage, die ich vor ein paar Tagen gestellt habe, versuche ich mich etwas zu strecken und etwas zu tun, auf das ich mich vorher noch nicht wirklich konzentriert habe. Ich habe ein wenig gesucht (sowohl hier als auch im Allgemeinen), kann aber nicht die Antworten (oder sogar vernünftige Hinweise) auf das finden, was ich erreichen möchte (obwohl einige Dinge nahe kommen).Deserialisieren von Chrome Bookmark JSON Daten in C#

Im Grunde versuche ich, die Daten für die Google Chrome-Lesezeichen-Datei mit der Json.NET library zu deserialisieren (obwohl, wenn es eine bessere Alternative gibt, bin ich dafür - die Dokumentation für diese Bibliothek ist an einigen Stellen ein wenig verwirrend). Ich bin ein wenig verwirrt, was den nächsten Schritt angeht, vor allem, weil ich an die phantastische Handhabung von JSON-Daten durch PHP gewöhnt bin (unter Verwendung von json_decode()), was einen einzelnen Funktionsaufruf und dann einen einfachen assoziativen Array-Zugriff erlaubt.

Die Bibliothek (Json.NET) möchte, dass ich einen Objekttyp angeben, in den JSON-Daten deserialisiert werden können, aber ich bin nicht sicher, wie man ein solches Objekt strukturiert, angesichts des Formats der Bookmarks-Datei selbst. Das Format ist etwas entlang der Linien von:

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

nun in PHP, würde ich viel mehr verwendet werden, etwas entlang der Linien der folgenden zu tun um die Daten zu erhalten, ich wollte, und endete mit " Json.NET ':

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

ich trainieren, einfach genug, was die Daten erstellen Objekte darzustellen (so etwas wie ein Wurzelobjekt, dann ein Lesezeichen-List-Objekt, und schließlich ein individuelles Lesezeichen-Objekt) - aber Ich bin mir wirklich nicht sicher, wie ich sie implementieren soll, und dann lasse ich die Bibliothek korrekt in die relevanten Objekte deserialisieren.

Jede Beratung, die angeboten werden kann, würde sehr geschätzt werden.

+0

Ich bin damit einverstanden, sollte C# hat einen 1-Funktion JSON-Reader. – Qwertie

Antwort

12

Es ist nicht notwendig, eine Art zu erklären, dass die json Struktur widerspiegelt:

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

Kompiliert nicht. Ich denke, dass Sie JsonTextReader stattdessen verwenden wollten. –

+0

Außerdem kann ich nichts über JavaScriptObject finden, welcher Namespace gehört dazu? Ein schnelles Google enthüllt nichts Spezifisches. –

+0

Entschuldigung, ich habe eine alte Version der Json.NET-Assembly verwendet. Ich sehe, dass sich die API seitdem geändert hat. Ich habe meinen Beitrag dementsprechend geändert –

Verwandte Themen