FileSystemInfo 对象序列化为NewtonJson的一种方法

有点复杂,专门写一个JsonConverter类做转换, 我好奇序列化时还可以手工设置某些内容,专门记录下来.  来源于 Serializing FileInfo or DirectoryInfo with Newtonsoft Json in .NET Core

如果直接按照下面的写法,会出现错误提示:“Newtonsoft.Json.JsonSerializationException”类型的未经处理的异常在 Newtonsoft.Json.dll 中发生 Unable to serialize instance of 'System.IO.FileInfo'.

FileInfo[] fi_jpg = di.GetFiles("*.jpg");
string jsonString = JsonConvert.SerializeObject(fi_jpg);

所以该作者写了一个类做转换

    public class FileSystemInfoConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(FileSystemInfo).IsAssignableFrom(objectType);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
                return null;
            var jObject = JObject.Load(reader);
            var fullPath = jObject["FullPath"].Value<string>();
            return Activator.CreateInstance(objectType, fullPath);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var info = value as FileSystemInfo;
            var obj = info == null
                ? null
                : new
                {
                    FullPath = info.FullName
                };
            var token = JToken.FromObject(obj);
            token.WriteTo(writer);
        }
    }

调用的时候这样写:

          
            FileInfo[] fi_jpg = di.GetFiles("*.jpg");

            var settings = new JsonSerializerSettings
            {
                Converters = new List<JsonConverter>
                {
                    new FileSystemInfoConverter()
                }
            };
            var json = JsonConvert.SerializeObject(fi_jpg, settings);
            Console.WriteLine(json);

            // 原作者此处写 JsonConvert.DeserializeObject<DirectoryInfo>(json, settings);  不能执行
       
            var info = JsonConvert.DeserializeObject(json, settings);
            Console.WriteLine(info);

这写的复杂了, 我最后直接写了一个文本文件,只记录文件名就行了, 技巧应当记录下来,以后可以用.   其实还有更简单的思路,比如使用LInq, 对这个Array序列化不会出错.

            var ary_fi = fi_total.Select(f => f.FullName).ToArray();
            var json = JsonConvert.SerializeObject(ary_fi);
            Console.WriteLine(json);

            string[] fname_list = JsonConvert.DeserializeObject<string[]> (json);

或者, 直接得到文件名列表的List  

string[] fileList = Directory.GetFiles(DirPath, "*.*", SearchOption.AllDirectories); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值