有点复杂,专门写一个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);