一个层级结构很深的json对象
下面的代码是JSON扁平化的帮助类:声明:
- 由于层级的json对象中名字可能会有重复,所有扁平化时key值带上了父级的key
- 使用一个key的list列表,来判断是否有重复的键插入,如果键已经存在,则跳过。
- 如果对于每个字段的信息都不可或缺,可以再判断有重复键的时候,修改键值名称,就能正常获取插入值了。
代码如下:
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
namespace MongoDBAccess
{
public class JsonHelper
{
private readonly List<string> _keys = new List<string>();
public string ToFlat(JObject obj, string parent)
{
string result = null;
foreach (var item in obj)
{
if (typeof(JObject) == item.Value.GetType())
{
var child = (JObject)item.Value;
var tmp = ToFlat(child, item.Key);
result += tmp;
}
else if (typeof(JArray) == item.Value.GetType())
{
var jarray = (JArray)item.Value;
if (jarray.Count == 0 && !_keys.Contains(item.Key))
{
result += string.Format("'{0}':{1},", item.Key, new JArray());
_keys.Add(item.Key);
}
else
{
foreach (var jitem in jarray)
{
if (jitem.HasValues)
{
var jchild = (JObject)jitem;
string tmp = ToFlat(jchild, item.Key);
result += tmp;
}
else if(!_keys.Contains(item.Key))
{
result += string.Format("'{0}':{1},", item.Key, new JArray(){jitem});
_keys.Add(item.Key);
}
}
}
}
else
{
var value = item.Value ?? " ";
if (string.IsNullOrEmpty(parent) && !_keys.Contains(item.Key))
{
result += string.Format("'{0}':\"{1}\",", item.Key, value);
_keys.Add(item.Key);
}
else if (!_keys.Contains(parent + "_" + item.Key))
{
result += string.Format("'{0}_{1}':'{2}',", parent, item.Key, value);
_keys.Add(parent + "_" + item.Key);
}
}
}
return result;
}
}
}