【问题标题】:How to ensure that the JSON string is UTF-8 encoded in Java如何确保 JSON 字符串在 Java 中是 UTF-8 编码的
【发布时间】:2020-07-21 02:20:16
【问题描述】:

我正在处理将 JSON 数据发送到 Web 服务的旧版 Web 服务客户端代码。最近发现,对于JSON body中的一些请求,由于JSON Body中的无效字符(非UTF8),服务给出了HTTP 400响应。

以下是导致问题的数据示例。

String value = "zu3z5eq tô‰U\f‹Á‹€z";

我正在使用org.json.JSONObject.toString() 方法来生成 JSON 字符串。请告诉我如何确保 JSON 字符串是 UTF-8 编码的?

我已经尝试了一些在线解决方案,例如转换为字节数组然后返回,使用 java charset 方法等,但它们不起作用。它们要么像中文/日文字符一样转换有效值,要么根本不起作用。

您能否就此提供一些意见?

【问题讨论】:

  • 您使用的是什么 JSON 库?您如何将请求发送到服务器?
  • org.json.JSONObject
  • String value 实际上是如何分配的? "zu3z5eq tô‰U\f‹Á‹€z"` 不是 JSON,所以我认为它不是来自 JSONObject.toString。
  • 这只是一个样本数据,它是 json 的一部分。不是实际的 json
  • 数据正在从前端应用程序输入。

标签: java json encoding utf-8


【解决方案1】:

使用 Base64 编码将值转换为 Byte[]。

  String value = "zu3z5eq tô‰U\f‹Á‹€z";

    // WHILE  SENDING  ENCODE THE VALUE
    byte[] encodedBytes = Base64.getEncoder().encode(value.getBytes("UTF-8"));
    String encodedValue = new String(encodedBytes, "UTF-8");

    // TRANSPORT....

    // ON RECEIVING END DECODE THE  VALUE
    byte[] decodedBytes = Base64.getDecoder().decode(encodedValue.getBytes("UTF-8"));
    System.out.println( new  String(decodedBytes, "UTF-8"));

【讨论】:

  • 我无法控制接收服务。所以这对我不起作用。
【解决方案2】:

创建OutputStreamWriter时需要设置字符编码:

 httpConn.connect();
 wr = new OutputStreamWriter(httpConn.getOutputStream(), StandardCharsets.UTF_8); 
 wr.write(jsonObject.toString());
 wr.flush();

否则,它默认为“平台默认编码”,这是一种历史上在您运行的任何系统上用于文本文件的编码。

【讨论】:

  • 嗨,我试过这个,但由于某种原因它仍然没有。下面是我发送的 JSON { "DESCRIPTION": "zu3z5eq tô‰U\f‹Á‹\u0017€z" } 收到的错误是 400 以及:请求的正文,应该是 JSON,无效,无法解码。字符串语法无效。
  • 这是有效的 JSON 语法并且字符编码是正确的。听起来您必须联系向您提供此 API 的人,这可能是他们的错误。也许他们有 JSON 标准中没有的额外要求,比如不允许转义码 \f
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2015-05-19
  • 2020-03-24
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多