0

jetty-util-ajaxパッケージのJSON.toString()メソッドを使用するときに UTF-8 文字をエスケープすることは可能ですか?

パッケージが内部ライブラリである可能性があることは理解していますが、これまでのところ、FCM (Firebase Cloud Messaging) および ADM (Amazon Device Messaging) を介して携帯電話にプッシュ通知を送信する他のタスクの中で、サーブレットでうまく機能しています。

ただし、私の問題は、ADMがUTF-8文字(私の場合はキリル文字)を受け入れず、 誤解を招くエラーメッセージで再現可能に失敗することです(AmazonはすべてのエラーメッセージでXMLについて話しますが、APIはJSONデータがPOSTされることを期待しています):

<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を見ると、いくつかのデコードが行われています (つまり、\uXXXXUTF-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;

しかし、逆のことを行うにはどうすればよいでしょうか。

4

1 に答える 1

1

ContentProvider は のソースでありContent-Type、手動で設定したヘッダーではありません。

あなたの...

.content(new StringContentProvider(jsonStr))

に ...

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

のデフォルトStringContentProvidertext/plain(JSON ではありません)

于 2018-03-28T15:57:29.143 に答える