【问题标题】:Deserialize JSON encoded HTML code with System.Text.Json使用 System.Text.Json 反序列化 JSON 编码的 HTML 代码
【发布时间】:2021-09-10 17:42:34
【问题描述】:

我正在使用 C# 调用一个 REST API,它返回一个包含 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 代码,但由于它包含各种元素,因此使用 System.Text.Json 反序列化的有效 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);

导致错误的元素例如:

  • \ "
  • &lt; !--
  • \r, \n, \t

我很想知道如何将上面代码中的 Body 属性清理为仅包含有效的 HTML,也许社区中的某个人对此有所了解。

【问题讨论】:

  • 你有没有尝试使用Encoding和Decoding???
  • 感谢您的回复!是的,我尝试过将 JsonSerializerOptions 与 Encoder 设置一起使用。我已经用信息更新了我的问题
  • 你试过转义回车(\\r)、制表符(\\t)和换行符(\\n)吗?

标签: c# html json system.text.json


【解决方案1】:

创建一个包含Body 属性(以及您将要使用的任何其他属性)的简单对象:

internal class ResponseObject
{
    public string Body { get; set; }
}

然后将响应 JSON 反序列化为该类型的对象,而不是 String。:

var content = JsonSerializer.Deserialize<ResponseObject>(html, options);

Content.Body 将包含解码后的 HTML。

【讨论】:

  • 我现在感觉很愚蠢?多么简单的解决方案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 2021-12-08
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多