Java中使用Gson转换JSON字符串为JSON对象时遇解析错误求助
解决JSON.parse: unexpected character at line 1 column 1的问题
我之前对接外部API时也碰到过一模一样的报错,咱们一步步来排查和解决:
可能的原因1:API返回的JSON字符串带有BOM(字节顺序标记)
很多外部API返回的UTF-8格式JSON会带一个看不见的BOM字符(ASCII码65279),这个字符在字符串开头,肉眼看不到,但会直接导致JSON.parse识别失败。
排查方法:
在解析前打印字符串第一个字符的ASCII码确认:
String test = smite.getPlayer(player); System.out.println("第一个字符ASCII码:" + (int)test.charAt(0));
如果输出是65279,那就肯定是BOM的问题。
解决办法:
移除开头的BOM字符:
if (test.startsWith("\uFEFF")) { test = test.substring(1); }
可能的原因2:双重序列化导致输出格式错误
你现在返回的是Gson的JsonArray对象,Spring MVC在处理返回值时,可能会把这个对象再序列化一次,导致最终输出的是一个带引号的字符串(比如"[{\"name\":\"PacSnackz\"}]"),而不是纯JSON数组,浏览器解析时自然会报错。
解决办法:
有两种靠谱的思路:
- 直接返回API原始字符串,让Spring直接把它作为JSON响应输出:
@RequestMapping("/player") @ResponseBody // 确保返回内容直接作为响应体 public String displayPlayer() throws Exception{ String player = "PacSnackz"; smite.createSession(); String test = smite.getPlayer(player); // 先移除BOM(如果存在) if (test.startsWith("\uFEFF")) { test = test.substring(1); } return test; }
- 解析成Java实体类列表返回,让Spring自动完成正确序列化:
先定义和API返回结构匹配的Player实体类:
public class Player { private String name; private int level; // 根据API返回的字段添加对应属性,以及getter/setter方法 }
然后修改Controller方法:
@RequestMapping("/player") public List<Player> displayPlayer() throws Exception{ String player = "PacSnackz"; smite.createSession(); String test = smite.getPlayer(player); // 移除BOM(如果存在) if (test.startsWith("\uFEFF")) { test = test.substring(1); } // 用Gson解析成实体类列表 Gson gson = new Gson(); Type playerListType = new TypeToken<List<Player>>(){}.getType(); List<Player> playerList = gson.fromJson(test, playerListType); return playerList; }
可能的原因3:API返回的不是合法JSON
有时候外部API会返回非纯JSON内容,比如开头有多余的空格、换行,或者带有防XSS的前缀(比如)]}',)。
排查方法:
直接打印test字符串,把内容复制到本地的JSON校验工具(比如IDE自带的JSON格式化功能),检查是否是合法的JSON格式。如果有多余前缀,直接截取掉对应的部分即可。
先从这几个方向排查,应该能很快解决这个问题!
内容的提问来源于stack exchange,提问作者user4068802
相关产品推荐
相关产品推荐

