C# 将嵌套JSON转换为CSV
我正在将一个超过10层的嵌套JSON对象转换为C#NET中的CSV文件 我一直在使用C# 将嵌套JSON转换为CSV,c#,json,csv,C#,Json,Csv,我正在将一个超过10层的嵌套JSON对象转换为C#NET中的CSV文件 我一直在使用JavaScriptSerializer().Deserialize(json)或XMLNodeXML=(XmlDocument)JsonConvert.DeserializeXmlNode(json)来分解对象。使用这些对象,我可以进一步写入CSV文件。但是现在JSON对象进一步扩展。大多数数据并没有真正被使用,所以我更喜欢原始数据转储 这是不是更简单的方法,我可以直接将数据转储为csv格式而不声明结构 示例J
JavaScriptSerializer().Deserialize(json)
或XMLNodeXML=(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]”
对象生成一行,它也有子对象。因此,听起来您的规则是,“打印至少具有一个基本值属性的对象的行,只要该对象是根对象或不具有至少具有一个基本值属性的子对象”。这有点棘手,但可以用
这是我写的,它对我有用 在这里,我们使用prop_prop格式将对象树的所有面包屑保存在标题中 并以prop1格式将jarray属性对象保存在标题中
public Dictionary<string, string> ComplexJsonToDictionary(JObject jObject, Dictionary<string, string> result, string field)
{
foreach (var property in jObject.Properties())
{
var endField = field + (string.IsNullOrEmpty(field) ? "" : "_") + property.Name;
var innerDictionary = new Dictionary<string, string>();
try
{
var innerValue = JObject.Parse(Convert.ToString(property.Value));
result.AddOrOverride(ComplexJsonToDictionary(innerValue, innerDictionary, endField));
}
catch (Exception)
{
try
{
var innerValues = JArray.Parse(Convert.ToString(property.Value));
try
{
var i = 0;
foreach (var token in innerValues)
{
var innerValue = JObject.Parse(Convert.ToString(token));
result.AddOrOverride(ComplexJsonToDictionary(innerValue, innerDictionary, endField+i++));
}
}
catch (Exception)
{
result.Add(endField, string.Join(",", innerValues.Values<string>()));
}
}
catch (Exception)
{
result.Add(endField, property.Value.ToString());
}
}
}
return result;
}
公共字典ComplexJsonToDictionary(JObject JObject,字典结果,字符串字段)
{
foreach(jObject.Properties()中的var属性)
{
var endField=field+(string.IsNullOrEmpty(field)?“”:“”)+property.Name;
var innerDictionary=新字典();
尝试
{
var innerValue=JObject.Parse(Convert.ToString(property.Value));
AddOrOverride(ComplexJsonToDictionary(innerValue,innerDictionary,endField));
}
捕获(例外)
{
尝试
{
var innerValues=JArray.Parse(Convert.ToString(property.Value));
尝试
{
var i=0;
foreach(innerValues中的var标记)
{
var innerValue=JObject.Parse(Convert.ToString(token));
AddOrOverride(ComplexJsonToDictionary(innerValue、innerDictionary、endField+i++);
}
}
捕获(例外)
{
Add(endField,string.Join(“,”,innerValues.Values());
}
}
捕获(例外)
{
Add(endField,property.Value.ToString());
}
}
}
返回结果;
}
感谢您的支持,如果合适,请撰写评论。您不能将这些数据转换为数据表吗。。然后从那里转换成CSV@MethodMan这正是我处理前几个级别所做的。毕竟,我发现把它们放到结构中太费时了,所以我正在检查是否有任何自动化。。它是否存储在db中?@MethodMan它来自HttpContext,我已进一步将其转换为字符串。我已尝试过,请检查此处:它不起作用,但我能够遍历。将在可能的情况下作为下一个更新。遗憾的是,它没有被标记为解决方案,或者至少没有被评论。某物如果我最后试一试,我会向你汇报的。绝妙的解决方案。
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
public Dictionary<string, string> ComplexJsonToDictionary(JObject jObject, Dictionary<string, string> result, string field)
{
foreach (var property in jObject.Properties())
{
var endField = field + (string.IsNullOrEmpty(field) ? "" : "_") + property.Name;
var innerDictionary = new Dictionary<string, string>();
try
{
var innerValue = JObject.Parse(Convert.ToString(property.Value));
result.AddOrOverride(ComplexJsonToDictionary(innerValue, innerDictionary, endField));
}
catch (Exception)
{
try
{
var innerValues = JArray.Parse(Convert.ToString(property.Value));
try
{
var i = 0;
foreach (var token in innerValues)
{
var innerValue = JObject.Parse(Convert.ToString(token));
result.AddOrOverride(ComplexJsonToDictionary(innerValue, innerDictionary, endField+i++));
}
}
catch (Exception)
{
result.Add(endField, string.Join(",", innerValues.Values<string>()));
}
}
catch (Exception)
{
result.Add(endField, property.Value.ToString());
}
}
}
return result;
}