2009-03-06 7 views
7

В ответ на вопрос, который я задал несколько дней назад, я пытаюсь немного растянуть себя и сделать то, что я на самом деле не уделял много раньше. Я сделал несколько поисков (как здесь, так и вообще), но не могу найти ответы (или даже разумные намеки) на то, что я хочу достичь (хотя, некоторые вещи близки - иш).Удаление десериализации Chrome Закладка данных JSON в C#

В принципе, я пытаюсь десериализовать данные для файлов закладок Google Chrome с помощью Json.NET library (хотя, если есть лучшая альтернатива, я все для этого - документация для этой библиотеки немного запутана в местах). Я немного смущен, что касается следующего шага, связанного прежде всего с тем, что он используется для фантастической обработки PHP данных JSON (с использованием json_decode()), что позволяет использовать один вызов функции, а затем простой доступ к ассоциативным массивам.

Библиотека (Json.NET) хочет, чтобы я задал тип объекта, в котором он может десериализовать данные JSON, но я не уверен, как организовать структурирование такого объекта, учитывая формат файла Bookmarks сам. Формат что-то вдоль линий:

{ 
    "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']; 

Я могу работать, достаточно просто, какие объекты для создания для представления данных (что-то вроде корневого объекта, то объекта списка закладок, и, наконец, отдельный объекта закладок) - но Я действительно не уверен, как их реализовать, а затем получить библиотеку для десериализации в соответствующие объекты правильно.

Любые советы, которые могут быть предложены, были бы очень признательны.

+0

Я согласен, C# должен иметь 1-функцию JSON читателя. – Qwertie

ответ

12

Не надо объявить тип, который отражает структуру 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

Не компилируется. Я думаю, вы хотели использовать JsonTextReader. –

+0

Кроме того, я ничего не могу найти о JavaScriptObject, какое пространство имён является частью? Быстрый Google не имеет ничего конкретного. –

+0

Извините, я использовал старую версию сборки Json.NET. Я вижу, что API изменился с тех пор. Соответственно, я изменил свой пост –