Java解析API返回JSON字符串时遇Unexpected character异常问题
这个报错的核心原因是你构造的JSON字符串格式完全不合法,解析器根本没法正确识别它的结构。咱们一步步拆解问题:
问题出在哪?
你写的字符串是:
String s = new String("{\"identified_faces_names\": \" [\"omar\",\"elhoussinep\"]\"}");
咱们把这个字符串还原成实际的JSON内容看看:{"identified_faces_names": " ["omar","elhoussinep"]"}
看到了吗?在" ["omar"这里,["前面的双引号没有转义,解析器读到这里会认为identified_faces_names的字符串值已经结束(因为遇到了第二个双引号),接下来的o就成了完全不符合JSON语法的非法字符——这就是你看到Unexpected character (o) at position 0的原因。
另外还有个逻辑问题:identified_faces_names明显是要存储一组名字,应该用JSON数组类型,而不是把数组当成字符串来存,这既不符合JSON的设计规范,也会给后续的数据处理添乱。
怎么解决?
方案1:使用合法的JSON数组(推荐)
直接把identified_faces_names定义为数组类型,同时正确转义字符串里的双引号:
String s = "{\"identified_faces_names\": [\"omar\",\"elhoussinep\"]}"; JSONParser parser = new JSONParser(); Object obj = parser.parse(s);
这样还原后的JSON是完全合法的:{"identified_faces_names": ["omar","elhoussinep"]}
解析器可以正常识别这个结构,不会再抛出异常。
方案2:如果必须把数组作为字符串存储(不推荐)
如果你因为特殊业务需求,一定要把数组内容放在字符串里,那必须转义字符串内部的所有双引号:
String s = "{\"identified_faces_names\": \"[\\\"omar\\\",\\\"elhoussinep\\\"]\"}"; JSONParser parser = new JSONParser(); Object obj = parser.parse(s);
还原后的JSON是:{"identified_faces_names": "[\"omar\",\"elhoussinep\"]"}
这种写法虽然能通过解析,但后续你还要额外把字符串转成数组,完全没必要,所以优先选方案1。
额外提醒
你提到API返回的内容是{"identified_faces_names": "["omar", "elhoussinep"]"},这个API返回本身也是非法的JSON格式。如果这是真实的接口返回,你还需要对接API的团队修复这个问题,让他们返回标准的JSON数组格式,避免后续再遇到类似的解析问题。
内容的提问来源于stack exchange,提问作者SinkingTitanic

