PSO2SERVER/Server/Json/JsonRead.cs

107 lines
3.5 KiB
C#
Raw Normal View History

2024-12-09 12:23:27 +08:00
using Newtonsoft.Json;
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace PSO2SERVER.Json
{
public class JsonRead
{
// 泛型方法:读取并反序列化 JSON 文件
public static async Task<T> DeserializeJsonAsync<T>(string filePath, JsonSerializerSettings settings = null)
{
if (string.IsNullOrEmpty(filePath))
{
Logger.Write("文件路径不能为空");
return default(T);
}
if (!File.Exists(filePath))
{
Logger.Write($"文件不存在: {filePath}");
return default(T);
}
try
{
// 异步读取文件内容
string json = await Task.Run(() => File.ReadAllText(filePath));
// 如果文件内容为空,记录日志并返回默认值
if (string.IsNullOrWhiteSpace(json))
{
Logger.Write($"文件内容为空: {filePath}");
return default(T);
}
// 反序列化 JSON
return JsonConvert.DeserializeObject<T>(json, settings ?? new JsonSerializerSettings());
}
catch (JsonException jsonEx)
{
// 捕获 JSON 反序列化异常
Logger.Write($"JSON 反序列化错误:{jsonEx.Message} 文件: {filePath}");
return default(T);
}
catch (FileNotFoundException fnfEx)
{
// 捕获文件找不到异常
Logger.Write($"文件未找到错误:{fnfEx.Message} 文件: {filePath}");
return default(T);
}
catch (UnauthorizedAccessException uaEx)
{
// 捕获权限相关的异常
Logger.Write($"权限错误:{uaEx.Message} 文件: {filePath}");
return default(T);
}
catch (Exception ex)
{
// 捕获其他未知异常
Logger.Write($"读取或反序列化文件 {filePath} 时发生异常: {ex.Message}");
return default(T);
}
}
// 同步版本:用于不需要异步操作的场景
public static T DeserializeJson<T>(string filePath, JsonSerializerSettings settings = null)
{
if (string.IsNullOrEmpty(filePath))
{
Logger.Write("文件路径不能为空");
return default(T);
}
if (!File.Exists(filePath))
{
Logger.Write($"文件不存在: {filePath}");
return default(T);
}
try
{
string json = File.ReadAllText(filePath);
if (string.IsNullOrWhiteSpace(json))
{
Logger.Write($"文件内容为空: {filePath}");
return default(T);
}
return JsonConvert.DeserializeObject<T>(json, settings ?? new JsonSerializerSettings());
}
catch (JsonException jsonEx)
{
Logger.Write($"JSON 反序列化错误:{jsonEx.Message} 文件: {filePath}");
return default(T);
}
catch (Exception ex)
{
Logger.Write($"读取或反序列化文件 {filePath} 时发生异常: {ex.Message}");
return default(T);
}
}
}
}