java - 当我需要该信息时,Jsoup 将 & 转换为 &

标签 java jsoup

在少数情况下,我传递的 JSON 具有用户执行某些操作的页面 url。该页面 url 将包含那些我需要的查询字符串部分,以便用户在我的应用程序需要时重定向到同一页面。我的 JSON 会像

{
"userId":"123456789",
"pageUrl":"http://exampl.com/designs.jsp?templateId=f348aaf2-45e4-4836-9be4-9a7e63105932&kind=123",
"action":"favourite"
}

但是当我通过 Jsoup.clean(json, Whitelist.basic()) 运行这个 json 时,我看到 & 被替换为 &。我可以配置 Jsoup 不单独转义这个字符吗?

最佳答案

转义发生在 org.jsoup.nodes.Entities 中。 这是有问题的代码

static void escape(StringBuilder accum, String string,
        Document.OutputSettings out, boolean inAttribute,
        boolean normaliseWhite, boolean stripLeadingWhite) {
    boolean lastWasWhite = false;
    boolean reachedNonWhite = false;
    EscapeMode escapeMode = out.escapeMode();
    CharsetEncoder encoder = out.encoder();
    CoreCharset coreCharset = CoreCharset.access$300(encoder.charset().name());
    Map map = escapeMode.getMap();
    int length = string.length();
    int codePoint;
    for (int offset = 0; offset < length; offset += Character.charCount(codePoint)) {
        codePoint = string.codePointAt(offset);

        if (normaliseWhite) {
            if (StringUtil.isWhitespace(codePoint)) {
                if ((stripLeadingWhite) && (!(reachedNonWhite)))
                    continue;
                if (lastWasWhite)
                    continue;
                accum.append(' ');
                lastWasWhite = true;
                continue;
            }
            lastWasWhite = false;
            reachedNonWhite = true;
        }

        if (codePoint < 65536) {
            char c = (char) codePoint;

            switch (c) {
            case '&':
                accum.append("&amp;");
                break;
            case ' ':
                if (escapeMode != EscapeMode.xhtml)
                    accum.append("&nbsp;");
                else
                    accum.append(c);
                break;
            case '<':
                if (!(inAttribute))
                    accum.append("&lt;");
                else
                    accum.append(c);
                break;
            case '>':
                if (!(inAttribute))
                    accum.append("&gt;");
                else
                    accum.append(c);
                break;
            case '"':
                if (inAttribute)
                    accum.append("&quot;");
                else
                    accum.append(c);
                break;
            default:
                if (canEncode(coreCharset, c, encoder))
                    accum.append(c);
                else if (map.containsKey(Character.valueOf(c)))
                    accum.append('&')
                            .append((String) map.get(Character.valueOf(c)))
                            .append(';');
                else
                    accum.append("&#x")
                            .append(Integer.toHexString(codePoint))
                            .append(';');
            }
        } else {
            String c = new String(Character.toChars(codePoint));
            if (encoder.canEncode(c))
                accum.append(c);
            else
                accum.append("&#x").append(Integer.toHexString(codePoint))
                        .append(';');
        }
    }
}

一个快速的方法来做你需要的是使用这样的东西

String str = "http://exampl.com/designs.jsp?templateId=f348aaf2-45e4-4836-9be4-9a7e63105932&kind=123";
str = Jsoup.clean(str, Whitelist.basic());
System.out.println(str);
str = Parser.unescapeEntities(str, true);
System.out.println(str);

另一种方法是扩展上述类并覆盖导致问题的方法,但由于它仅对包可见(默认可见性),这意味着您必须下载源代码,更改上面的方法,并覆盖类(因此该方法是可见的)。

关于java - 当我需要该信息时,Jsoup 将 & 转换为 &,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379040/

相关文章:

android - Jsoup,使用前缀路径导航标签树

java - 在 android studio 中单击按钮时创建线性布局可编程性

java - JSoup 请求 url 更改

javascript - 尝试在android中使用jsoup提交表单

java - 如何将字符串转换为文件名

java - 添加到字符串数组时为空指针

java - 如何用 Jsoup 解析这个 html 表

java - 添加项目 - 不同的变量名称

java - 在 Java 中更新 JTextArea

java - 我希望根据 Excel 中声明的运行模式运行测试用例