Разбор C# JSON вместо R

Предположим, у меня есть вложенный файл json, который выглядит так:

[{"toplevel":{"firstleveldata":{"id":12345,"no":123}},"secondleveldata":{"фрукты":{"яблоки":"y"},"veg":{ "маленький":{"зеленый":{"свежий":{"доступный":3}}}}},"данные третьего уровня":{"фрукты":{"изменения":[{"itemid":1,"subno ":1,"зеленый":[],"красный":[{"дополнительный":2,"элемент":5}]}]}}}]

и следующий код R, который может разобрать его на хороший data.frame, кроме последнего (если это можно исправить, это бонус)

как бы выглядела аккуратная альтернатива с использованием С#? Это не то, что я когда-либо кодировал раньше, поэтому не знал, с чего начать.

Конечная цель состоит в том, чтобы экспортировать вложенный JSON в CSV, несколько CSV с первичными/внешними ключами для слияния необходимого.

Код R для контекста.

library(jsonlite)

library(tidyverse)

fun <- function(x)
       {list(
#keys
id = pluck(x,"toplevel","firstleveldata","id", .default = NA),
no = pluck(x,"toplevel","firstleveldata","no", .default = NA),

apples = pluck(x,"secondleveldata","fruit","apples", .default = NA),
itemid = pluck(x,"toplevel","thirdleveldata","fruit","changes","itemid", .default = NA) #doesn't work)}

out<-map_df(list.files("my_json_file",full.names=TRUE),~map_df(fromJSON(txt=., simplifyVector=FALSE), fun))

out

Спасибо


person Mikey    schedule 15.08.2018    source источник
comment
Создайте модель, которая представляет ваши данные, а затем используйте Json.NET для десериализации/сериализации.   -  person maccettura    schedule 15.08.2018


Ответы (1)


Быстрый способ изучить эту структуру и начать работу с json в C# — скопировать пакет json в том виде, в котором вы ожидаете. Взяв в качестве примера то, что у вас есть в вашем вопросе, скопируйте json в буфер обмена и создайте новый файл кода С# и напишите свое пространство имен по умолчанию только следующим образом:

namespace Data
{
    // Next step will be here
}

После этого поместите курсор между фигурными скобками, нажмите меню редактирования, затем вставьте специальные, JSON as Classes

Это создаст для вас несколько классов, которые соответствуют имеющейся у вас схеме JSON. В этом случае есть Class1, потому что он не может определить имя объекта со свойствами toplevel, secondlevel и т.д. Вы можете дать ему более значимое имя для вашего случая.

Откройте консоль диспетчера пакетов (если вы не видите ее в VS, нажмите Ctrl+Q и введите «Консоль диспетчера пакетов»). В диспетчере пакетов введите следующее

Install-Package Newtonsoft.Json

убедившись, что ваше решение сохранено, и указав проект, в который вы хотите добавить этот пакет, в качестве проекта по умолчанию, как показано на снимке экрана:

Снимок экрана консоли диспетчера пакетов с выбранным и выделенным проектом по умолчанию.

и дождитесь его завершения. Теперь у вас будет возможность десериализовать JSON, который у вас есть, в свои классы. Перейдите туда, где вы хотите выполнить обработку, и введите следующее...

// at the top of the file...
using Newtonsoft.Json;

// where you need to decode it...
string jsonData = GetYourJsonDataFromAFileOrAPICall(); // replace with how you get the json
var items = JsonConvert.DeserializeObject<IEnumerable<MyItem>>(jsonData);

На этом этапе у вас будет IEnumerable<MyItem> (MyItem — это то, что я переименовал в Class1), представляющее ваш json. Вы можете изменить это на список или массив, если хотите более конкретную коллекцию.

person Fabulous    schedule 15.08.2018
comment
PM› Install-Package Newtonsoft.Json Install-Package: проект «По умолчанию» не найден. В строке: 1 символ: 1 + Install-Package Newtonsoft.Json + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound : (по умолчанию: строка) [Install-Package], ItemNotFoundException + FullyQualifiedErrorId: NuGetProjectNotFound, NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand Я пробовал stackoverflow.com/questions/10130333/ - person Mikey; 21.08.2018
comment
При выполнении этой команды убедитесь, что выбран проект, в который вы хотите добавить пакет. Я обновлю свой ответ, чтобы отразить это. И похоже, что вопрос, на который вы ссылаетесь, основан на другой проблеме (проблема с сервером во время запроса) - person Fabulous; 23.08.2018