JSON——Json对象扁平化

一个层级结构很深的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;
        }
    }
}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值