You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:54:29