如何使用System.Text.Json正确反序列化包含HTML代码的JSON字段
解决方案
错误原因
报错的核心原因是你错误地将Body字段中提取的HTML内容直接传入了JsonSerializer.Deserialize<string>()方法。该方法要求输入参数是符合JSON语法的字符串(必须以双引号包裹、内部转义符合JSON规范),但HTML内容以<开头,不符合JSON结构,因此抛出解析异常。你之前配置的UnsafeRelaxedJsonEscaping属于序列化输出时的配置,对反序列化过程不生效,因此无法解决问题。
正确处理步骤
1. 先完整反序列化整个API返回的JSON
你需要先反序列化整个JSON结构,拿到Body字段的原始转义后的值,不要单独处理Body内容,有两种实现方式:
方式1:定义实体类反序列化(推荐)
首先定义对应JSON结构的实体类:
public class ApiResult { public string Body { get; set; } }
反序列化完整JSON字符串:
// fullJson 为调用REST API返回的完整JSON字符串 var apiResult = JsonSerializer.Deserialize<ApiResult>(fullJson); string rawBodyContent = apiResult.Body;
方式2:动态解析(无需定义实体类)
如果不想额外定义实体类,可以用JsonNode动态解析:
// fullJson 为调用REST API返回的完整JSON字符串 JsonNode jsonNode = JsonNode.Parse(fullJson); string rawBodyContent = jsonNode["Body"].GetValue<string>();
2. 清洗解码得到可用HTML
第一步拿到的rawBodyContent中可能还存在"、<这类HTML实体,直接用.NET内置的HTML解码器处理即可,也可以按需移除不需要的换行、制表符:
// 解码HTML实体 string validHtml = System.Net.WebUtility.HtmlDecode(rawBodyContent); // 可选:移除多余的转义字符与空白符 validHtml = validHtml.Replace("\r", string.Empty) .Replace("\n", string.Empty) .Replace("\t", string.Empty) .Trim();
处理后的validHtml就是可以直接使用的有效HTML代码。
内容的提问来源于stack exchange,提问作者nor0x
相关产品推荐
相关产品推荐

