一个层级结构很深的json对象

下面的代码是JSON扁平化的帮助类:

声明:

  1. 由于层级的json对象中名字可能会有重复,所有扁平化时key值带上了父级的key
  2. 使用一个key的list列表,来判断是否有重复的键插入,如果键已经存在,则跳过。
  3. 如果对于每个字段的信息都不可或缺,可以再判断有重复键的时候,修改键值名称,就能正常获取插入值了。

代码如下:

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;
        }
    }
}




GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 2 个月前
8c391e04 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐