Servlet JSON响应编码问题 "="

3

我有一个简单的JSON对象如下:

{"status":"Success","action":"Redirect","sessionid":6467349943156736,"url":"https://myapplicationing.com/go?id=1000"}

我创建了如下的JSON:

JSONObject json = new JSONObject();
json.put("status", "Success");
json.put("action", "Redirect");
json.put("sessionid", "6467349943156736");
json.put("url", "https://myapplicationing.com/go?id=1000");

当我将这个JSON作为响应返回时
resp.setContentType("application/json");        
        resp.setHeader("Cache-Control", "no-cache");
        resp.setCharacterEncoding("utf-8");
        try {
//           json.write(resp.getWriter());//[tried]
//          Gson gson = new GsonBuilder().disableHtmlEscaping().create();
            resp.getWriter().println(json.toString());
//          resp.getWriter().println(gson.toJson(json));//[TRIED]
        } catch (Exception e) {
            e.printStackTrace();
        }

但它仍然给我返回以下JSON字符串:
{"status":"Success","action":"Redirect","sessionid":6467349943156736,"url":"https://myapplicationing.com/go?id\u003d1000"}

这是为什么要对JSON字符串进行编码。它将"="替换为"\u003d"。
我尝试了这个方法:
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
resp.getWriter().println(gson.toJson(json));

但是没有起作用。有什么解决方案吗?

你不需要在意(除了可读性); "a\u003db""a=b" 是完全相同的 JSON 字符串。 - fge
但是这个响应被发送到另一个应用程序,该应用程序只会在浏览器中打开请求,但有些浏览器无法正确打开它,而有些浏览器可以正常工作。 - Swap L
1
那么这是远程应用程序中的一个错误,它不能正确地解码JSON字符串;您应该向他们报告。 - fge
哦!!!那么我没有办法处理这个问题了吗? - Swap L
你可以提供任何关于Jackson的示例吗? - Swap L
显示剩余21条评论
1个回答

1

是的,但我不想像那样发送JSON。如何在不使用它的情况下发送? - Swap L
当您通过网络发送JSON时,它们必须以某种格式进行编码,而Unicode是最常用和首选的格式。 我从未见过Unicode编码会引起麻烦的情况。 几乎所有处理JSON的应用程序都具有处理Unicode编码的功能。 - anirudh
@anirudh 这不是问题所在,问题在于客户端存在漏洞。OP发送的JSON表示完全有效,如果客户端正常工作,它将把JSON字符串“a\u003db”解码为字符串a=b--但是一些有缺陷的客户端却不能这样做。 - fge
好的,那么客户端的代码需要改变对吧?这里不需要修复对吧? - anirudh
2
@anirudh 呵呵,说起来容易做起来难,一如既往... 如果这很容易的话,Excel就不需要BOM来读取UTF-8编码的CSV文件了;) - fge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接