新文章 网摘 文章 随笔 日记

自己写的读写Json文件的JsonHelper

 

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;

namespace Phoenix.Spider.Helpers
{
    public class JsonHelper
    {
        private string _fileFullName;
        public JsonHelper(string fileFullName)
        {
            _fileFullName = fileFullName;
        }
        /// <summary>
        /// 加载整个文件并反序列化为一个对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T Get<T>()
        {
            if (!File.Exists(_fileFullName))
            {
                return default(T);
            }
            string jsonStr;
            jsonStr = File.ReadAllText(_fileFullName);

            var result = JsonConvert.DeserializeObject<T>(jsonStr);
            return result;
        }
        /// <summary>
        /// 从Json文件中读取对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="keyLink">对象的键名链,例如 Order.User</param>
        /// <returns>类型为T的对象</returns>
        public T Get<T>(string keyLink)
        {
            if (!File.Exists(_fileFullName))
            {
                return default(T);
            }

            using (StreamReader streamReader = new StreamReader(_fileFullName))
            {
                string jsonStr = streamReader.ReadToEnd();
                dynamic obj = JsonConvert.DeserializeObject(jsonStr);
                if (obj == null)
                {
                    obj = (JObject)JToken.FromObject(new object());
                }
                var keys = keyLink.Split('.');
                dynamic currentObject = obj;
                foreach (var key in keys)
                {
                    currentObject = currentObject[key];
                    if (currentObject == null)
                    {
                        return default(T);
                    }
                }

                var result = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(currentObject.ToString());
                return result;
            }

        }
        /// <summary>
        /// 设置对象值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="keyLink">对象的键名链,例如 Order.User,当其上级不存在时将创建</param>
        /// <param name="value"></param>
        public void Set<T>(string keyLink, T value)
        {
            dynamic obj;
            if (!File.Exists(_fileFullName))
            {
                obj = (JObject)JToken.FromObject(new object());
            }
            else
            {
                string jsonStr;
                jsonStr = File.ReadAllText(_fileFullName);
                obj = JsonConvert.DeserializeObject(jsonStr);
                if (obj==null)
                {
                    obj = (JObject)JToken.FromObject(new object());
                }
            }

            var keys = keyLink.Split('.');
            dynamic currentObject = obj;

            for (int i = 0; i < keys.Length; i++)
            {
                var oldObject = currentObject;
                currentObject = currentObject[keys[i]];
                var isValueType = value.GetType().IsValueType;

                if (i == keys.Length - 1)
                {
                    if (isValueType || value is string)
                    {
                        oldObject[keys[i]] = new JValue(value);
                    }
                    else
                    {
                        oldObject[keys[i]] =JToken.FromObject(value);
                    }

                }
                else
                {
                    //如果不存在,新建
                    if (currentObject == null)
                    {
                        JObject o = (JObject)JToken.FromObject(new object());
                        oldObject[keys[i]] = o;
                        currentObject = oldObject[keys[i]];
                        continue;
                    }
                }
            }
            Save<dynamic>(obj);
        }
        /// <summary>
        /// 保存Json文件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        public void Save<T>(T obj)
        {
            string str = JsonConvert.SerializeObject(obj, Formatting.Indented);
            File.WriteAllText(_fileFullName, str);
        }
    }
}

 

使用方法:

            var jHelper = new JsonHelper(path2);
            var obj = jHelper.Get<AAAA>("OracleConn.Others.OOO");
            jHelper.Set<AAAA>("OracleConn.Others.OOO", new AAAA { Key = "", Value = "" });
            jHelper.Set<AAAA>("tttt.mmmm.bbbb", new AAAA { Key = "1", Value = "" });
            jHelper.Set<string>("aaaaaa", "13555");
            var aaaaa = jHelper.Get<string>("aaaaaa");
            var bbbbb = jHelper.Get<AAAA>("tttt.mmmm.bbbb");

 

posted @ 2020-06-27 13:47  岭南春  阅读(158)  评论(0)    收藏  举报