Преобразование динамического формата 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
}
}
]
}
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 невозможен. Чтобы разобрать его, вам понадобятся несколько хитрых шагов.
- Получите строку json и минимизируйте ее.
- Используйте регулярное выражение или что-то в этом роде, узнайте, что такое шаблон json.
- Используйте шаблон, чтобы получить правильный класс модели для его десериализации.