如何将 ChoETL Json 映射到 CSV 复杂类型
How to Map ChoETL Json to CSV Complex Types
我有以下Class结构
public class ResultData
{
[JsonProperty(PropertyName = "Id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "Results")]
public IEnumerable<Result> Results{ get; set; }
}
public class Result
{
public string Name { get; set; }
public string Value { get; set; }
}
这是我转换为 csv 的代码
private static void ToCsv(ResultData data)
{
StringBuilder csv = new StringBuilder();
var json = JsonConvert.SerializeObject(data);
var config = new ChoJSONRecordConfiguration {AllowComplexJSONPath = true};
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Id"));
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Results", "Name") { FieldType = typeof(string[]) });
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Results", "Value") { FieldType = typeof(string[]) });
using (var r = ChoJSONReader.LoadText(json, config))
{
using var w = new ChoCSVWriter(csv).WithFirstLineHeader().UseNestedKeyFormat(false);
w.Write(r);
}
File.WriteAllText("2.csv", csv.ToString());
}
Json
{"Id":"839c0a09-f2d0-4f29-9cce-bc022d3511b5","Results":[{"Name":"ABC","Value":"5"},{"Name":"CDE","Value":"2"}]}
我想要一个 CSV 文件,在一列中包含 ID 和结果名称,在另一列中包含结果值
这是从 JSON
生成 CSV 输出的方法
string json = @"{
""Id"": ""839c0a09-f2d0-4f29-9cce-bc022d3511b5"",
""Results"": [
{
""Name"": ""ABC"",
""Value"": ""5""
},
{
""Name"": ""CDE"",
""Value"": ""2""
}
]
}";
StringBuilder csv = new StringBuilder();
using (var r = ChoJSONReader<ResultData>.LoadText(json)
.UseJsonSerialization()
)
{
using (var w = new ChoCSVWriter(csv)
.WithFirstLineHeader()
.Configure(c => c.IgnoreDictionaryFieldPrefix = true)
)
{
w.Write(r.Select(r1 => new
{
r1.Id,
Results = r1.Results.ToDictionary(kvp => kvp.Name, kvp => kvp.Value)
}));
}
}
Console.WriteLine(csv.ToString());
输出:
Id,ABC,CDE
839c0a09-f2d0-4f29-9cce-bc022d3511b5,5,2
更新:
private static void ToCsv(ResultData data)
{
using (var w = new ChoCSVWriter("2.csv")
.WithFirstLineHeader()
.Configure(c => c.IgnoreDictionaryFieldPrefix = true)
)
w.Write(data.ConvertToEnumerable().Select(r1 => new
{
r1.Id,
Results = r1.Results.ToDictionary(kvp => kvp.Name, kvp => kvp.Value)
}));
}
我有以下Class结构
public class ResultData
{
[JsonProperty(PropertyName = "Id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "Results")]
public IEnumerable<Result> Results{ get; set; }
}
public class Result
{
public string Name { get; set; }
public string Value { get; set; }
}
这是我转换为 csv 的代码
private static void ToCsv(ResultData data)
{
StringBuilder csv = new StringBuilder();
var json = JsonConvert.SerializeObject(data);
var config = new ChoJSONRecordConfiguration {AllowComplexJSONPath = true};
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Id"));
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Results", "Name") { FieldType = typeof(string[]) });
config.JSONRecordFieldConfigurations.Add(new ChoJSONRecordFieldConfiguration("Results", "Value") { FieldType = typeof(string[]) });
using (var r = ChoJSONReader.LoadText(json, config))
{
using var w = new ChoCSVWriter(csv).WithFirstLineHeader().UseNestedKeyFormat(false);
w.Write(r);
}
File.WriteAllText("2.csv", csv.ToString());
}
Json
{"Id":"839c0a09-f2d0-4f29-9cce-bc022d3511b5","Results":[{"Name":"ABC","Value":"5"},{"Name":"CDE","Value":"2"}]}
我想要一个 CSV 文件,在一列中包含 ID 和结果名称,在另一列中包含结果值
这是从 JSON
生成 CSV 输出的方法string json = @"{
""Id"": ""839c0a09-f2d0-4f29-9cce-bc022d3511b5"",
""Results"": [
{
""Name"": ""ABC"",
""Value"": ""5""
},
{
""Name"": ""CDE"",
""Value"": ""2""
}
]
}";
StringBuilder csv = new StringBuilder();
using (var r = ChoJSONReader<ResultData>.LoadText(json)
.UseJsonSerialization()
)
{
using (var w = new ChoCSVWriter(csv)
.WithFirstLineHeader()
.Configure(c => c.IgnoreDictionaryFieldPrefix = true)
)
{
w.Write(r.Select(r1 => new
{
r1.Id,
Results = r1.Results.ToDictionary(kvp => kvp.Name, kvp => kvp.Value)
}));
}
}
Console.WriteLine(csv.ToString());
输出:
Id,ABC,CDE
839c0a09-f2d0-4f29-9cce-bc022d3511b5,5,2
更新:
private static void ToCsv(ResultData data)
{
using (var w = new ChoCSVWriter("2.csv")
.WithFirstLineHeader()
.Configure(c => c.IgnoreDictionaryFieldPrefix = true)
)
w.Write(data.ConvertToEnumerable().Select(r1 => new
{
r1.Id,
Results = r1.Results.ToDictionary(kvp => kvp.Name, kvp => kvp.Value)
}));
}