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

如何使用Gson解析字符串格式的JSON数组并转换为VO对象

Gson解析报错Expected a string but was BEGIN_ARRAY解决方案

报错根因

异常触发在jsonElement.getAsJsonObject().get("data").getAsString()代码行:Gson解析请求体后发现data字段对应的数据类型是JSON数组(标识符为BEGIN_ARRAY,即字符[),但你调用了仅支持字符串类型的getAsString()方法,类型不匹配导致抛出异常。
该问题大概率是实际发送的Postman请求和你贴的示例不一致:data字段没有用双引号包裹为转义字符串,而是直接传了原生JSON数组,实际请求结构为:

{"data": [{"id":"1","name":"james","passwd":"abcd"},...]}

解决方案

方案1:兼容两种请求格式(快速修复现有代码)

不需要修改Postman请求,直接调整解析逻辑,自动适配data为字符串或数组的场景:

@PostMapping(value = "/testApi")
public void testApi(@RequestBody String data){
    Gson gson = new Gson();
    JsonObject rootObj = gson.fromJson(data, JsonObject.class);
    JsonElement dataNode = rootObj.get("data");
    String arrayJsonStr;
    // 节点类型判断兼容两种格式
    if (dataNode.isJsonArray()) {
        arrayJsonStr = gson.toJson(dataNode);
    } else {
        arrayJsonStr = dataNode.getAsString();
    }
    List<TestVo> list = gson.fromJson(arrayJsonStr, new TypeToken<List<TestVo>>(){}.getType());
    // 后续业务逻辑
}

方案2:标准化请求结构(更推荐的工程化写法)

直接定义外层请求VO,让Spring MVC自动完成参数绑定,不需要手动解析原生JSON字符串:

  1. 定义外层请求封装类
@Data
public class TestReq {
    // 如果传的是原生JSON数组,用这个字段
    private List<TestVo> data;
    // 如果传的是转义JSON字符串,替换为:private String data;
}
  1. 调整Controller代码
@PostMapping(value = "/testApi")
public void testApi(@RequestBody TestReq req){
    List<TestVo> list = req.getData();
    // 如果data是字符串类型,补充一步解析即可:
    // List<TestVo> list = new Gson().fromJson(req.getData(), new TypeToken<List<TestVo>>(){}.getType());
    // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者HoyhandKlay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:12:01