Gson解析含空格JSON值抛出MalformedJsonException异常如何解决?
问题根因
这个报错和Gson支不支持字段值带空格没有任何关系,标准JSON语法本身就允许字符串值包含空格,你提供的带"TORONTO CITY"的JSON示例本身是完全合法的,直接交给Gson解析不会出任何问题。
真正的问题出在你获取待解析字符串的逻辑:
- 你的Controller方法加了
@RequestBody注解,Spring在进入方法前就已经把请求JSON反序列化成了Masterpayload对象。因为data字段声明为Object类型,Spring默认用的Jackson反序列化器会把它解析成LinkedHashMap实例。 - 你此时调用
json.toString(),调用的是Java Map的原生toString()方法,输出的格式是{RECORD=[{STATE=TORONTO CITY}, {WORK=SERVICE}]}这种——键、字符串值都没有JSON要求的双引号,键值之间用等号分隔而不是冒号,根本不是合法JSON。 - 不带空格的
TORONTOCITY能解析成功纯粹是巧合:Gson解析时有一定容错机制,连续无分隔符的字符串会被误识别为合法值;一旦值里带空格,解析器读到空格就会认为当前值已经结束、对象结构提前终止,直接抛出Unterminated object异常。
修复方案
选任意一种即可:
- 最省事方案:去掉无意义的二次解析,直接强转
Spring已经把data解析成了符合结构的Map对象,完全不需要转字符串再用Gson解析一次,直接强转就行:public ResponseEntity<MasterBlockChainResponse> dummy(@RequestBody(required=false) Masterpayload valueobject) { MasterBlockChainResponse response = new MasterBlockChainResponse(); Map<String, Object> map = (Map<String, Object>) valueobject.getData(); response.setId(valueobject.getId()); response.setResourceName(valueobject.getResourceName()); response.setData(map); return ResponseEntity.status(HttpStatus.OK).body(response); } - 如果你必须保留Gson解析的流程,不要直接调用
toString(),先把对象序列化为标准JSON字符串再解析:Gson gson = new Gson(); Object json = valueobject.getData(); // 先转成合法JSON格式字符串,再做反序列化 String validJson = gson.toJson(json); Map<String, Object> map = gson.fromJson(validJson, Map.class); - 长期优化方案:修改
Masterpayload类的字段定义,把data的类型直接声明为Map<String, Object>,让Spring反序列化时直接生成目标类型,省掉后续所有类型转换步骤:private String id; private String resourceName; private Map<String, Object> data; // 补全对应getter、setter
内容的提问来源于stack exchange,提问作者krishan
相关产品推荐
相关产品推荐

