2009-03-06 11 views
7

En respuesta a una pregunta que hice hace unos días, intento estirarme un poco y hacer algo en lo que no me he enfocado mucho antes. He hecho algunas búsquedas (tanto aquí, y en general), pero no puedo encontrar las respuestas (o incluso consejos razonables) a lo que quiero lograr (aunque, algunas cosas se acercan mucho).Deserialización de marcador de Chrome Datos JSON en C#

Básicamente, estoy tratando de deserializar los datos para el archivo de marcadores de Google Chrome usando el Json.NET library (aunque, si hay una alternativa mejor, estoy de acuerdo con esto - la documentación de esta biblioteca es un poco confusa en algunos lugares) Estoy un poco confundido en cuanto al próximo paso a seguir, debido principalmente a que estoy acostumbrado al fantástico manejo de datos JSON de PHP (usando json_decode()), lo que permite una llamada de función única y luego acceso simple de matriz asociativa.

La biblioteca (Json.NET) quiere que especifique un tipo de Objeto en el que pueda deserializar los datos JSON, pero no estoy seguro de cómo estructurar dicho Objeto, dado el formato del archivo de Marcadores sí mismo. El formato es algo a lo largo de las líneas de:

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

Ahora, en PHP, estaría mucho más acostumbrado a hacer algo en la línea de lo siguiente, para obtener los datos que quería, y terminando con ' Json.NET ':

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

puedo trabajar, simplemente lo suficiente, lo que se opone a crear para representar los datos (algo así como un objeto raíz, a continuación, un objeto de la lista de favoritos, y finalmente un objeto marcador individuo) - pero Realmente no estoy seguro de cómo implementarlos, y luego lograr que la biblioteca se deserialice correctamente en los objetos relevantes.

Cualquier consejo que se pueda ofrecer sería muy apreciado.

+0

Estoy de acuerdo, C# debe tener un lector de JSON-1 función. – Qwertie

Respuesta

12

No es necesario declarar un tipo que refleja la estructura 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

No se compilará. Creo que en realidad querías usar JsonTextReader. –

+0

Además, no puedo encontrar nada sobre JavaScriptObject, ¿de qué espacio de nombres es parte? Un Google rápido no revela nada específico. –

+0

Disculpe, estaba usando una versión anterior del ensamblado Json.NET. Veo que la API ha cambiado desde entonces. Modifiqué mi publicación en consecuencia –

Cuestiones relacionadas