gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:41 24 4
gpt4 key购买 nike

在少数情况下,我传递的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com