且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在C#中将json转换为平面结构

更新时间:2023-01-16 11:20:55

解决方案如下. JavaScriptSerializer从json字符串('json')创建对象('o'),然后BuildVariablesList方法遍历该对象并填充包含结果的字典('additionalParameters').

The solution for this is as following. JavaScriptSerializer creates object ('o') from json string ('json'), than method BuildVariablesList traverse the object and populates dictionary ('additionalParameters') that contains results.

    var jss = new JavaScriptSerializer();
    var o = return new DynamicJsonObject(jss.Deserialize<Dictionary<string, object>>(json));

    var additionalParameters = new Dictionary<string, string>();
    BuildVariablesList(o.GetInternalDictionary(), "", additionalParameters);

    private static string AppendToPathString (string path, object part )
    {
        return path.Trim().Length == 0 ? part.ToString() : path + '.' + part;
    }

    public static void BuildVariablesList(object obj, string path, Dictionary<string, string> result)
    {
        if ( obj is ArrayList)
        {
            var arrayObj = obj as ArrayList;
            for (var i = 0; i<arrayObj.Count; i++ )
            {
                BuildVariablesList(arrayObj[i], AppendToPathString(path,i), result);
            }
        }else if ( obj is Dictionary<string, object>)
        {
            var dictObject = obj as Dictionary<string, object>;
            foreach (var entry in dictObject)
            {
                if (entry.Value is String && (path.Trim().Length > 0 || !ReservedFieldNames.Contains( entry.Key.ToLower())))
                {
                    result.Add(AppendToPathString(path,entry.Key), entry.Value as String);
                }
                else if (entry.Value is Dictionary<string, object>)
                {
                    BuildVariablesList(entry.Value as Dictionary<string, object>, AppendToPathString(path, entry.Key), result);
                }
                else if (entry.Value is ArrayList)
                {
                    BuildVariablesList(entry.Value as ArrayList, AppendToPathString(path, entry.Key), result);
                }
            }
        }            
    }