java - java/webservice(json) 中的字符串中的空格会产生不同的字节数组

标签 java json string byte

在重构项目中的一些方法之前,我目前正在为 jersey 2-0 webservice (json) 编写一些验收测试,并且我偶然发现了从 webservice 断言空白字符串的问题。

我从我的网络服务获得以下输出:

"Boxes": [
    {
        "id": 1,
        "title": " ", //Yes this is a white-space
        "genre": "genre",
        "info": "some info",
        "rating": "3",
        "artist": "Artist 1"
    }
],

我将响应从网络服务转换为 JSONObject,如下所示:

public static JSONObject responseToJsonObject(HttpResponse httpResponse) throws IOException {
    String responseString = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
    return new JSONObject(responseString);
}

然后在我的测试中,是像这样进行正常断言:

//* http request creation omitted *//
JSONObject jsonResponse = JsonTranslator.responseToJsonObject(httpRequest)
JSONArray boxes = jsonResponse.getJSONArray("boxes ");
JSONObject result = boxes .getJSONObject(0);

assertEquals(" ", result.getString("title"));

问题是最后一个断言失败。

org.junit.ComparisonFailure: 
Expected : 
Actual   : 

我可能知道为什么,字节数组会产生两个不同的结果。一个有一个字节 [32] (在 java 中创建的),而来自 web 服务的一个有 [-62,-96]

我以前从未遇到过这个问题。如果我尝试在 EntityUtils 方法中不使用 "UTF-8" 进行转换,我会得到更糟糕的结果(  字节数组:[-61,-126,-62,-96]

我可以看到我的网络服务的 content-type header 已正确设置为 application/json

谁能解释一下这里发生了什么?

最佳答案

您到达那里的角色不是“正常”空间。这是一个不间断的空间。 HTML 中的相同字符将用   描述。

其unicode值为'\u00A0'。它的 UTF-8 表示形式是 C2 A0,这就是您在字节数组中获得的内容。

我相信如果您尝试以下断言它会起作用:

assertEquals("\u00A0", result.getString("title"));

关于java - java/webservice(json) 中的字符串中的空格会产生不同的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29912421/

相关文章:

java - 如何使用父标记对象查找内部子标记名列表

javascript - jquery 从 JSON 数组中的选择框中收集所有选项值

string - 使用 slice 值的 Golang 字符串格式

c# - 从字符串中删除背靠背的子字符串,但不是删除所有出现的子字符串 - c#

java - Android Post UTF-8 HttpURLConnection

Java回显服务器

java - 如何在选择时预先选择一个选项 (Struts 2)

C# 编辑动态字符串

json - 使用 jq 和引用值处理 json 数组

c# - 为什么 String 是 Value 类型,虽然它是一个类而不是一个结构?