Java中JSON转JsonObject出现特殊字符问题及排查咨询
移除冗余的编码转换操作
你当前代码里把String转字节再转回String的操作完全多余,反而会破坏原有编码。直接用原始mm字符串传给Gson解析即可:private JsonObject getCon(String mm) { return new GsonBuilder().create().fromJson(mm, JsonObject.class) .getAsJsonObject("dict").getAsJsonObject("con"); }String本身已是Unicode字符序列,额外的字节转换只会引入编码不匹配问题,这是乱码的核心诱因之一。校验原始响应的编码与内容
仅部分description字段出问题,说明原始JSON响应的编码可能非UTF-8,或传输中被篡改。可以直接打印mm的原始内容,或输出mm.getBytes()的字节数组,对比正常字符串Post Approval - Completed, Post Approval - Pending的UTF-8字节序列,看差异点——比如正常短横线-的UTF-8字节为0x2D,若原始字节是其他值,说明编码不匹配。检查响应获取阶段的编码设置
确认mm的来源:如果是HTTP响应,要确保请求时指定Accept-Charset: UTF-8,读取响应流时用InputStreamReader(inputStream, StandardCharsets.UTF_8)而非默认编码;如果是文件读取,同样要明确指定UTF-8编码打开文件。排查特殊字符的真实类型
部分字段异常可能是因为包含非ASCII特殊字符(比如全角短横线、软连字符),而编码解析不匹配。可以用Character.codePointAt(mm, 异常位置)查看乱码处的字符编码,确认是否为特殊字符导致的解析异常。改用Gson直接流解析方式
如果mm来自输入流,跳过字符串转换步骤,直接用流解析避免编码损耗:private JsonObject getCon(InputStream inputStream) { return new GsonBuilder().create().fromJson(new InputStreamReader(inputStream, StandardCharsets.UTF_8), JsonObject.class) .getAsJsonObject("dict").getAsJsonObject("con"); }
内容的提问来源于stack exchange,提问作者nick

