使用 System.Text.Json 反序列化 JSON 编码的 HTML 代码
Deserialize JSON encoded HTML code with System.Text.Json
我正在使用 C# 调用 REST API,其中 returns 一个包含 HTML 代码的 JSON 对象。这是我感兴趣的对象的示例
{
"Body": "<html class=\"sg-campaigns\"><head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\"><meta content=\"IE=Edge\"><style type=\"text/css\">\r\n<!--\r\nbody ..."
}
我想进一步处理 HTML 代码,但由于它包含各种有效元素 JSON 使用 System.Text.Json
的字符串反序列化失败并出现以下异常
System.Text.Json.JsonReaderException: '<' is an invalid start of a value.
我试过使用下面的代码反序列化 Body 属性的内容
var options = new JsonSerializerOptions()
{
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
var content = JsonSerializer.Deserialize<String>(html, options);
导致错误的元素例如:
\ "
< !--
\r
、\n
、\t
我很想知道如何将上面代码中的 Body
属性清除为仅包含有效的 HTML,也许社区中有人对此有想法。
创建一个包含 Body
属性(以及您将要使用的任何其他属性)的简单对象:
internal class ResponseObject
{
public string Body { get; set; }
}
然后将响应 JSON 反序列化为该类型的对象而不是 String
。:
var content = JsonSerializer.Deserialize<ResponseObject>(html, options);
Content.Body
将包含解码后的 HTML.
我正在使用 C# 调用 REST API,其中 returns 一个包含 HTML 代码的 JSON 对象。这是我感兴趣的对象的示例
{
"Body": "<html class=\"sg-campaigns\"><head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\"><meta content=\"IE=Edge\"><style type=\"text/css\">\r\n<!--\r\nbody ..."
}
我想进一步处理 HTML 代码,但由于它包含各种有效元素 JSON 使用 System.Text.Json
的字符串反序列化失败并出现以下异常
System.Text.Json.JsonReaderException: '<' is an invalid start of a value.
我试过使用下面的代码反序列化 Body 属性的内容
var options = new JsonSerializerOptions()
{
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
var content = JsonSerializer.Deserialize<String>(html, options);
导致错误的元素例如:
\ "
< !--
\r
、\n
、\t
我很想知道如何将上面代码中的 Body
属性清除为仅包含有效的 HTML,也许社区中有人对此有想法。
创建一个包含 Body
属性(以及您将要使用的任何其他属性)的简单对象:
internal class ResponseObject
{
public string Body { get; set; }
}
然后将响应 JSON 反序列化为该类型的对象而不是 String
。:
var content = JsonSerializer.Deserialize<ResponseObject>(html, options);
Content.Body
将包含解码后的 HTML.