Java Web服务使用GSON解析JSON响应遇语法错误的解决咨询
问题分析与解决
错误原因
- 解析类型不匹配:你要解析的JSON是单个对象(外层是
{}),但代码里却用List<Response>去接收,Gson期望读到数组的起始标记[,实际却读到对象的起始标记{,因此抛出Expected BEGIN_ARRAY but was BEGIN_OBJECT异常。 - 实体类字段与JSON不匹配:你的
Response类缺少JSON里的exceptionMessages、trailId、isSuccessful字段,且errors字段和JSON里的validationErrors字段名不一致,导致Gson无法正确映射数据。
修正步骤
1. 修正实体类
更新Response.java,补充缺失字段,并通过@SerializedName注解让字段名和JSON对应(不想改Java字段名时用):
import com.google.gson.annotations.SerializedName; import java.util.List; public class Response{ public Response() { super(); } private String message; // 用注解映射JSON里的validationErrors字段 @SerializedName("validationErrors") private List<ValidationErrors> errors; // 新增exceptionMessages字段 @SerializedName("exceptionMessages") private List<ValidationErrors> exceptionMessages; private String trailId; private boolean isSuccessful; // 所有字段的getter和setter,补充新增字段的方法 public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } public void setErrors(List<ValidationErrors> errors) { this.errors = errors; } public List<ValidationErrors> getErrors() { return errors; } public List<ValidationErrors> getExceptionMessages() { return exceptionMessages; } public void setExceptionMessages(List<ValidationErrors> exceptionMessages) { this.exceptionMessages = exceptionMessages; } public String getTrailId() { return trailId; } public void setTrailId(String trailId) { this.trailId = trailId; } public boolean isSuccessful() { return isSuccessful; } public void setSuccessful(boolean successful) { isSuccessful = successful; } }
ValidationErrors.java无需修改,保持原样即可。
2. 修正解析代码
因为JSON是单个对象,直接解析成Response实例,不需要用TypeToken处理列表:
import com.google.gson.Gson; // 假设response是你的JSON响应字符串 Gson gson = new Gson(); Response responseObj = gson.fromJson(response.toString(), Response.class); // 通过getter获取对应值 String message = responseObj.getMessage(); List<ValidationErrors> validationErrors = responseObj.getErrors(); boolean isSuccess = responseObj.isSuccessful();
验证
修改完成后,Gson就能正确将JSON映射到Response对象,你可以通过对象的getter方法获取所有字段的值。
内容的提问来源于stack exchange,提问作者Ti J
相关产品推荐
相关产品推荐

