gpt4 book ai didi

c# - 将嵌套的 JSON 转换为 CSV

转载 作者:太空狗 更新时间:2023-10-29 17:49:16 25 4
gpt4 key购买 nike

我正在将一个超过 10 个级别的嵌套 JSON 对象转换为 C# .NET 中的 CSV 文件。

我一直在使用 JavaScriptSerializer().Deserialize<ObjectA>(json)XmlNode xml = (XmlDocument)JsonConvert.DeserializeXmlNode(json)分解对象。使用这些对象,我可以进一步写入 CSV 文件。但是现在 JSON 对象进一步扩展。大多数数据并未真正使用,因此我更喜欢原始数据转储。

有没有更简单的方法,我可以在不声明结构的情况下将数据转储为 csv 格式?

示例 JSON

{
"F1":1,
"F2":2,
"F3":[
{
"E1":3,
"E2":4
},
{
"E1":5,
"E2":6
},
{
"E1":7,
"E2":8,
"E3":[
{
"D1":9,
"D2":10
}
]
},
]
}

我预期的 CSV 输出是

F1,F2,E1,E2,D1,D2
1,2
1,2,3,4
1,2,5,6
1,2,7,8,9,10

最佳答案

您的请求存在不一致:您希望为根对象生成一行,该根对象有子对象,但您不希望为 "F3[2]" 生成一行对象,它也有 child 。所以听起来你的规则是,“为具有至少一个原始值属性的对象打印一行,只要该对象是根对象或者没有具有至少一个原始值属性的后代对象” .这有点棘手,但可以用 LINQ to JSON 来完成

        var obj = JObject.Parse(json);

// Collect column titles: all property names whose values are of type JValue, distinct, in order of encountering them.
var values = obj.DescendantsAndSelf()
.OfType<JProperty>()
.Where(p => p.Value is JValue)
.GroupBy(p => p.Name)
.ToList();

var columns = values.Select(g => g.Key).ToArray();

// Filter JObjects that have child objects that have values.
var parentsWithChildren = values.SelectMany(g => g).SelectMany(v => v.AncestorsAndSelf().OfType<JObject>().Skip(1)).ToHashSet();

// Collect all data rows: for every object, go through the column titles and get the value of that property in the closest ancestor or self that has a value of that name.
var rows = obj
.DescendantsAndSelf()
.OfType<JObject>()
.Where(o => o.PropertyValues().OfType<JValue>().Any())
.Where(o => o == obj || !parentsWithChildren.Contains(o)) // Show a row for the root object + objects that have no children.
.Select(o => columns.Select(c => o.AncestorsAndSelf()
.OfType<JObject>()
.Select(parent => parent[c])
.Where(v => v is JValue)
.Select(v => (string)v)
.FirstOrDefault())
.Reverse() // Trim trailing nulls
.SkipWhile(s => s == null)
.Reverse());

// Convert to CSV
var csvRows = new[] { columns }.Concat(rows).Select(r => string.Join(",", r));
var csv = string.Join("\n", csvRows);

Console.WriteLine(csv);

使用

public static class EnumerableExtensions
{
// http://stackoverflow.com/questions/3471899/how-to-convert-linq-results-to-hashset-or-hashedset
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
}

哪些输出:

F1,F2,E1,E2,D1,D2
1,2
1,2,3,4
1,2,5,6
1,2,7,8,9,10

关于c# - 将嵌套的 JSON 转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32961051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com