Преобразование динамического формата JSON в CSV с помощью ChoETL

Я бы получал JSON в различных форматах и ​​иерархиях. Необходимо знать возможность конвертировать любой формат JSON в CSV путем динамического формирования столбцов. В качестве примера я предоставил необходимые данные, ниже - многоуровневый JSON и ожидаемые Выход CSV

JSON

{
   "getUsers":[
      {
         "UserInformation":{
            "Id":1111122,
            "firstName":"*****1",
            "UserType":{
               "name":"CP"
            },
            "primaryState":"MA",
            "otherState":[
               "MA",
               "BA"
            ],
            "createdAt":null
         }
      },
      {
         "UserInformation":{
            "Id":3333,
            "firstName":"*****3",
            "UserType":{
               "name":"CPP"
            },
            "primaryState":"MPA",
            "otherState":[
               "KL",
               "TN"
            ],
            "createdAt":null
         }
      }
   ]
}

Выход CSV

2 ответа

Вот как это можно сделать с помощью Cinchoo ETL программно.

Сначала создайте объект конфигурации вместе с конфигурациями полей во время выполнения и передайте его читателю для загрузки JSON.

StringBuilder csv = new StringBuilder();

var config = new ChoJSONRecordConfiguration();
config.JSONPath = "$..getUsers[*].UserInformation";
config.AllowComplexJSONPath = true;

config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Id"));
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("FirstName"));
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("UserType", "$.UserType.name"));
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("primaryState"));
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("otherState", "$.otherState[*]") { FieldType = typeof(string[]) });
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("createdAt"));

using (var r = ChoJSONReader.LoadText(json, config))
{
    using (var w = new ChoCSVWriter(csv).WithFirstLineHeader()
        .UseNestedKeyFormat(false)
        )
        w.Write(r);
}

Console.WriteLine(csv.ToString());

Работоспособный код вроде этого:

Прочитать строку json и написать файл CSV

 StringBuilder sb = new StringBuilder();
            sb.Append(@"
{
   ""getUsers"":[
      {
         ""UserInformation"":{
            ""Id"":1111122,
            ""firstName"":""*****1"",
            ""UserType"":{
               ""name"":""CP""
            },
            ""primaryState"":""MA"",
            ""otherState"":[
               ""MA"",
               ""BA""
            ],
            ""createdAt"":null
         }
      },
      {
         ""UserInformation"":{
            ""Id"":3333,
            ""firstName"":""*****3"",
            ""UserType"":{
               ""name"":""CPP""
            },
            ""primaryState"":""MPA"",
            ""otherState"":[
               ""KL"",
               ""TN""
            ],
            ""createdAt"":null
         }
      }
   ]
}
");

var reader = ChoJSONReader<User>.LoadText(sb.ToString());
var user = reader.Read();

using (var parser = new ChoCSVWriter<UserInformation>("User.csv").WithFirstLineHeader())
{
    parser.Write(user.getUsers.Select(x => x.UserInformation));
}

Классы сериализации

class User
{
    public List<UserDetail> getUsers { get; set; }
}

class UserDetail
{
    public UserInformation UserInformation { get; set; }
}
class UserInformation
{
    public int Id { get; set; }
    public string firstName { get; set; }
    public UserType UserType { get; set; }
    public string primaryState { get; set; }
    public List<string> otherState { get; set; }
    public DateTime? createdAt { get; set; }

}

class UserType
{
    public string name { get; set; }
}

редактировать

Динамический парсинг всего формата только с помощью JSON reader невозможен. Чтобы разобрать его, вам понадобятся несколько хитрых шагов.

  1. Получите строку json и минимизируйте ее.
  2. Используйте регулярное выражение или что-то в этом роде, узнайте, что такое шаблон json.
  3. Используйте шаблон, чтобы получить правильный класс модели для его десериализации.
Другие вопросы по тегам