Deserializing Chrome Bookmark dados JSON em C #
-
03-07-2019 - |
Pergunta
Em resposta a uma pergunta que fiz há alguns dias, eu estou tentando me esticar um pouco, e fazer algo que eu não tenho realmente focado em muito antes. Eu fiz alguma pesquisa (tanto aqui, e em geral), mas não consegue encontrar as respostas (ou mesmo sugestões razoáveis) para o que eu quero alcançar (embora, algumas coisas vêm close-ish).
Basicamente, eu estou tentando desserializar os dados para o arquivo do Google Chrome bookmarks usando o Json.NET biblioteca (no entanto, se há uma alternativa melhor, eu sou tudo para isso - a documentação para esta biblioteca é um pouco confuso em lugares). Estou um pouco confuso quanto ao próximo passo a tomar, devido principalmente a ser usado para a manipulação fantástica do PHP de dados JSON (usando json_decode () ), permitindo uma única chamada da função, e o acesso associativo-matriz, em seguida, simples.
A biblioteca (Json.NET) quer que eu especificar um tipo de objeto que pode desserializar os dados JSON em, mas eu realmente não estou certo como ir sobre a estruturação tal objeto, dado o formato do arquivo Marcadores si . O formato é algo ao longo das linhas 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
}
Agora, em PHP, eu estaria muito mais acostumado a fazer algo ao longo das linhas do seguinte, para obter os dados que eu queria, e terminando com 'Json.NET':
$data['roots']['bookmark_bar']['children'][0]['name'];
Eu posso trabalhar fora, simplesmente o suficiente, quais objetos para criar para representar os dados (algo como um objeto raiz, em seguida, um objeto lista de marcadores, e, finalmente, um objeto marcador indivíduo) - mas eu realmente não estou certo de como implementá-las, e em seguida, obter a biblioteca para deserialize para os objetos relevantes corretamente.
Qualquer conselho que pode ser oferecido seria muito apreciada.
Solução
Não é necessário declarar um tipo que reflete a estrutura 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);
}
}