使用Java调用Twitter API v2添加含非ASCII字符规则时遇JSON无效错误
问题描述
我使用GitHub上官方提供的FilteredStreamDemo.java调用Twitter API v2的过滤流端点时功能正常,但当添加包含非ASCII字符(例如单词“siccità”)的规则时,返回以下错误:
{"errors":[{"parameters":{},"message":"Invalid JSON"}],"title":"Invalid Request","detail":"One or more parameters to your request was invalid.","type":"https://api.twitter.com/2/problems/invalid-request"}
我尝试将单词转换为UTF-8但没有效果,请问在Java中是否有办法为Twitter API v2添加包含非ASCII字符的规则?
解决方案
以下是几个可行的处理步骤:
配置JSON序列化工具,保留非ASCII字符原始形式
多数Java JSON库(如Jackson、Gson)默认会把非ASCII字符转义成Unicode编码(比如\u00E0),但Twitter API v2支持直接传入UTF-8编码的原生非ASCII字符。你可以修改序列化配置,关闭自动转义:- 若使用Jackson:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false); - 若使用Gson:
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
- 若使用Jackson:
明确指定HTTP请求体的UTF-8编码
构建请求时,必须确保请求头和请求体都使用UTF-8编码。以HttpURLConnection为例:connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); connection.setDoOutput(true); try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonPayload.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); }直接使用原始字符串构造规则
不要手动对非ASCII字符做转码操作,直接将包含非ASCII的字符串放入规则中,依赖JSON库和HTTP客户端处理编码逻辑。比如直接构造规则对象:String ruleValue = "siccità"; // 推荐用JSON库序列化对象,避免手动拼接出错 Rule rule = new Rule(ruleValue, "siccita-tag"); String jsonPayload = mapper.writeValueAsString(Map.of("add", List.of(rule)));
验证要点
发送请求前,可以打印序列化后的JSON字符串,确认非ASCII字符是原始形式(如“siccità”)而非转义后的Unicode编码;同时检查请求头的Content-Type是否正确设置了charset=UTF-8。
内容的提问来源于stack exchange,提问作者Thunderarea

