How to convert json to flat structure in C#
I'm trying to write function in C# that will converts JSON to a key/value pairs. It should support arrays. So for example the following 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}
]
}
]
}
should be converted to:
Is it any simple way to do this task? The logic becomes complicated when I start taking into account arrays and nested arrays.
I'd look into http://json.codeplex.com/
I think that does what you need.
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);
}
}
}
}
链接地址: http://www.djcxy.com/p/59458.html
上一篇: 第一大数字矩阵中最大的产品,速度很快
下一篇: 如何将json转换为C#中的扁平结构