gpt4 book ai didi

java - 如何在jetty-util-ajax中使用JSON.toString()方法转义Unicode?

转载 作者:行者123 更新时间:2023-12-02 11:27:08 25 4
gpt4 key购买 nike

jetty-util-ajax中使用JSON.toString()方法时是否可以转义UTF-8字符包?

我知道该包可能是一个内部库,但到目前为止,它在 servlet 中运行良好,其中除其他任务外还发送推送通过 FCM(Firebase 云消息传递)和 ADM(亚马逊设备消息传递)向手机发送通知。

但是我的问题是 ADM 不接受任何UTF-8 字符(在我的例子中是西里尔字母)并且可重复失败误导性错误消息(Amazon 在其所有错误消息中谈论 XML,而 their API expects JSON data being POSTed ):

<SerializationException>
<Message>Could not parse XML</Message>
</SerializationException>

java.lang.IllegalStateException:
unknown char '<'(60) in |||<SerializationException>| <Message>Could
not parse XML</Message>|</SerializationException>||

那么 Jetty 9.4.8.v20171121 是否有可能对字符进行编码?

这是我的 Java 代码:

// this string is POSTed to ADM server
public String toAdmBody() {
Map<String, Object> root = new HashMap<>();
Map<String, String> data = new HashMap<>();
root.put("data", data);
data.put("body", mBody);
// ADM does not accept integers for some reason
data.put("gid", String.valueOf(mGid));
// HOW TO ENCODE UTF-8 CHARS TO \uXXXX HERE?
return JSON.toString(root);
}

private void postMessage(String registrationId, int uid, String jsonStr) {
mHttpClient.POST(String.format("https://api.amazon.com/messaging/registrations/%1$s/messages", registrationId))
.header(HttpHeader.ACCEPT, "application/json; charset=utf-8")
.header(HttpHeader.CONTENT_TYPE, "application/json; charset=utf-8")
.header(HttpHeader.AUTHORIZATION, "Bearer " + mAccessToken)
.header("X-Amzn-Type-Version", "com.amazon.device.messaging.ADMMessage@1.0")
.header("X-Amzn-Accept-Type", "com.amazon.device.messaging.ADMSendResult@1.0")
// add registrationID and notification body - for retrying after fetching token
.attribute("registrationId", registrationId)
.attribute("body", jsonStr)
.content(new StringContentProvider(jsonStr))
.send(mMessageListener);
}

查看Jetty源代码时JSON.java正在发生一些解码(即从 \uXXXX 到 UTF-8 字符):

case 'u':
char uc = (char)((TypeUtil.convertHexDigit((byte)source.next()) << 12)
+ (TypeUtil.convertHexDigit((byte)source.next()) << 8)
+ (TypeUtil.convertHexDigit((byte)source.next()) << 4)
+ (TypeUtil.convertHexDigit((byte)source.next())));
scratch[i++] = uc;
break;

但是如何做相反的事情呢?

最佳答案

ContentProvider 是 Content-Type 的来源,而不是您手动设置的 header 。

改变你的...

.content(new StringContentProvider(jsonStr))

到...

.content(new StringContentProvider(jsonStr, "application/json", StandardCharsets.UTF_8))

StringContentProvider 的默认值是 text/plain (不是 JSON)

关于java - 如何在jetty-util-ajax中使用JSON.toString()方法转义Unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49538806/

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