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

C# 如何在C语言中将json转换为平面结构#,c#,json,C#,Json,我试图用C语言编写函数,将JSON转换为键/值对。它应该支持数组。例如,以下JSON: { title: title_value, components: [ { component_id: id1, menu: [ {title: menu_title1}, {title: menu_title_x},

我试图用C语言编写函数,将JSON转换为键/值对。它应该支持数组。例如,以下JSON:

{ 
    title: title_value,
    components: [
        {
            component_id: id1,
            menu: [
                   {title: menu_title1},
                   {title: menu_title_x},
                   {id: menu_id1}    
            ]
        },
        {
             component_id: id2,
             menu: [
                   {title: menu_title2},
                   {id: menu_id2}    
             ]
        }
    ]
}
应转换为:

  • title=title\u值
  • components.0.component_id=id1
  • components.0.menu.0.title=菜单标题1
  • components.0.menu.1.title=菜单标题
  • components.0.menu.2.id=菜单\u id1
  • 组件1.组件id=id2
  • 组件1.menu.0.title=菜单标题2
  • components.1.menu.1.id=菜单\u id2
这是完成这项任务的简单方法吗?当我开始考虑数组和嵌套数组时,逻辑就变得复杂了。

我会考虑


我想这正是您所需要的。

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

    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);
                }
            }
        }            
    }
var jss=new JavaScriptSerializer();
var o=返回新的DynamicJsonObject(jss.Deserialize(json));
var additionalParameters=新字典();
BuildVariableList(o.GetInternalDictionary(),“”,附加参数);
私有静态字符串AppendToPathString(字符串路径,对象部分)
{
返回path.Trim().Length==0?part.ToString():path+'.''part;
}
公共静态void BuildVariablesList(对象对象对象、字符串路径、字典结果)
{
if(obj是ArrayList)
{
var arrayObj=obj作为ArrayList;
for(var i=0;i 0 | |!ReservedFieldNames.Contains(entry.Key.ToLower()))
{
Add(AppendToPathString(path,entry.Key),entry.Value作为字符串);
}
else if(entry.Value为字典)
{
BuildVariablesList(entry.Value作为字典,AppendToPathString(path,entry.Key),result);
}
else if(entry.Value为ArrayList)
{
BuildVariablesList(entry.Value作为ArrayList,AppendToPathString(path,entry.Key),result);
}
}
}            
}