【问题标题】:Decode escaped HTML markup from JSON response on Android in Java在 Java 中从 Android 上的 JSON 响应中解码转义的 HTML 标记
【发布时间】:2016-09-24 22:11:32
【问题描述】:

我正在尝试解码我​​的 android 应用程序作为转义 HTML 接收的 JSON 属性。我在最新的 Android Studio IDE (2.2) 上使用 Java 8,找不到来自 Google 的 Android 库或现有的 Java 代码来帮助我解决这个问题。

我不想剥离 HTML,我想取消转义 HTML,然后在 TextView 中完整地显示 HTML。有很多方法可以正确显示 HTML,但到目前为止,只有一种方法可以通过我在 GitHub 上找到的名为 Unbescape 的库从转义字符串中提取 HTML。我希望我不必包含该库,因为我只有一个 JSON 属性要处理,这似乎有点矫枉过正。

接收到的 JSON 属性为:

"HTML": "\u003cp\u003e\u003cu\u003e\u003cstrong\u003e另一条消息\u003c/strong\u003e\u003c/u\u003e\u003c/p\u003e\n\n\u003cp\u003e\u0026# 160;\u003c/p\u003e\n\n\u003ctable边框=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\"\u003e\n\ t\u003ctbody\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003easdf\u003c/td\u003e\n\t\t\t\u003ctd\u003easdfa\u003c/td\ u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003easdf\u003c/td\u003e\n\t\t\t\ u003ctd\u003easdfa\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003easdfa\u003c/td\u003e\ n\t\t\t\u003ctd\u003esdfasd\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\ n\u003cp\u003e\u0026#160;\u003c/p\u003e\n"

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 使用 JSON 解析器。见How to parse JSON in Android。
  • 我应该澄清一下。我使用 Retrofit HTTP 库收到一个 HTTP 响应。使用 Retrofit RestAdapter.Builder() 方法并添加一个 Gson 构建器实例,通过 setConverter 构建器步骤添加为 .setConverter( GsonConverter( GsonBuilder().....
  • 此时 JSON 响应被转换为 Java POJO。换句话说,没有任何解析要做。这是属性之一中包含的 HTML 的转义。我知道如何将反序列化器添加到 GsonBuilder 调用链中,我希望找到现有代码来执行 HTML 所需的 unescape 操作。
  • 如果您显示的内容是您获得的 JSON 的一部分,那么 JSON 解析器将为您取消转义值。如果您显示的是 after JSON 解析器已经为您取消转义的值,那么该值是双重转义的。最好的解决方案是修复代码不双重转义。
  • 问题中出现-1的原因是什么? Stack Overflow 的新功能请求:所有反对意见都需要解释。这种投反对票似乎有点像巨魔。

标签: java android html json decode


【解决方案1】:

假设您展示的是 JSON 对象的 JSON 属性,您可以非常简单地测试 JSON 解析。

用{} 包围的内容创建一个文本文件,使其成为有效的JSON 对象。

{ "HTML": "\u003cp\u003e\u003cu\u003e\u003cstrong\u003eAnother Message\u003c/strong\u003e\u003c/u\u003e\u003c/p\u003e\n\n\u003cp\u003e\u0026#160;\u003c/p\u003e\n\n\u003ctable border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\"\u003e\n\t\u003ctbody\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003easdf\u003c/td\u003e\n\t\t\t\u003ctd\u003easdfa\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003easdf\u003c/td\u003e\n\t\t\t\u003ctd\u003easdfa\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003easdfa\u003c/td\u003e\n\t\t\t\u003ctd\u003esdfasd\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cp\u003e\u0026#160;\u003c/p\u003e\n" }

然后运行这段代码,读取文本文件。

正如您在下面看到的,JSON 解析器会为您转义所有内容。

public class Test {
    @SerializedName("HTML")
    String html;
    public static void main(String[] args) throws Exception {
        Gson gson = new GsonBuilder().create();
        try (Reader reader = new FileReader("test.json")) {
            Test test = gson.fromJson(reader, Test.class);
            System.out.println(test.html);
        }
    }
}

输出

<p><u><strong>Another Message</strong></u></p>

<p>&#160;</p>

<table border="1" cellpadding="1" cellspacing="1" style="width:100%">
    <tbody>
        <tr>
            <td>asdf</td>
            <td>asdfa</td>
        </tr>
        <tr>
            <td>asdf</td>
            <td>asdfa</td>
        </tr>
        <tr>
            <td>asdfa</td>
            <td>sdfasd</td>
        </tr>
    </tbody>
</table>

<p>&#160;</p>

【讨论】:

  • 谢谢安德烈亚斯,您的解决方案奏效了。我错过了 @SerializedName("HTML") 注释。优秀的测试工具......再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 2014-10-09
相关资源
最近更新 更多