Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将嵌套JSON转换为CSV_C#_Json_Csv - Fatal编程技术网

C# 将嵌套JSON转换为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

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

我一直在使用
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;
    }