.NET 4.6.2下Newtonsoft.Json序列化遇PathTooLongException求助
解决.NET 4.6.2下Newtonsoft.Json序列化的PathTooLongException问题
首先排查最可能的低级错误:参数传递错误
你的Serialize方法第二个参数被命名为json,但代码中是将其作为StreamWriter的文件路径使用。如果调用该方法时,你误将JSON字符串内容而非目标文件路径传给了这个参数,必然会触发PathTooLongException——因为JSON内容本身就是超长字符串,当成路径肯定超出Windows的路径长度限制。
先确认调用代码:确保第二个参数是合法的文件路径,而非JSON文本。
如果确实是文件路径过长,按以下方案处理
方案1:修复App.config配置,启用完整的长路径支持
.NET 4.6.2中,启用长路径支持需要同时设置两个开关,且配置必须包裹在<configuration>节点内。修改你的App.config为:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" /> </runtime> </configuration>
此配置对.NET框架类库生效,Newtonsoft.Json依赖的StreamWriter会受此配置影响。
方案2:手动添加长路径前缀
如果配置不生效,可以手动给绝对路径添加Windows长路径前缀:
- 本地路径:在路径前添加
\\?\,例如C:\long\path\file.json改为\\?\C:\long\path\file.json - UNC路径:在路径前添加
\\?\UNC\,例如\\server\share\file.json改为\\?\UNC\server\share\file.json
修改你的序列化方法如下:
private static void Serialize(object obj, string filePath) { string longPath = filePath; // 处理长路径前缀,仅支持绝对路径 if (!longPath.StartsWith(@"\\?\")) { if (longPath.StartsWith(@"\\")) { // 转换UNC路径 longPath = @"\\?\UNC\" + longPath.Substring(2); } else { // 转换本地绝对路径 longPath = @"\\?\" + longPath; } } var serializer = new JsonSerializer(); using (var sw = new StreamWriter(longPath)) using (JsonWriter writer = new JsonTextWriter(sw)) { serializer.Serialize(writer, obj); } }
方案3:缩短文件路径
最直接的方式是将目标文件移动到更短的路径下,比如根目录、使用更短的文件夹名称,确保整个路径长度不超过Windows默认的260字符限制。
额外注意:确认方法功能是否匹配需求
你提到“将JSON字符串序列化到对象中”,但当前代码是将对象序列化为JSON文件(序列化操作)。如果你的实际需求是将JSON字符串反序列化为对象,应该使用StringReader而非StreamWriter,此时不需要涉及文件路径,也就不会触发路径异常。正确的反序列化代码示例:
private static T Deserialize<T>(string json) { var serializer = new JsonSerializer(); using (var sr = new StringReader(json)) using (JsonReader reader = new JsonTextReader(sr)) { return serializer.Deserialize<T>(reader); } }
内容的提问来源于stack exchange,提问作者Kresten
相关产品推荐
相关产品推荐

