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

Java解析JSON后字段值为空/0问题排查求助

问题排查与解决方案

你遇到的字段值为null或默认值的问题,核心原因是Jackson的字段映射规则和你的DTO类getter/setter命名不匹配,具体来说:

问题根源

JSON中的字段是标准驼峰命名(比如productId, branchId, customerNumber),但你的DTO类里的getter/setter方法命名没有遵循JavaBean规范:

  • 比如JSON里的productId,你对应的getter是getProductid()(末尾的Id写成了小写id),而Jackson默认会根据getter方法名推断字段名(把getProductid()解析成productid,和JSON里的productId不匹配)
  • 同理,branchId的getter是getBranchid(),customerNumber的getter是getCustomernumber(),都不符合驼峰转方法名的规范,导致Jackson无法正确把JSON字段值映射到DTO属性上。
  • 另外你还犯了一个小错误:Response类里把JSON的productId对应到了partnerId属性,这完全是字段名不匹配,也会导致值映射失败。

解决方案

有两种常用的修复方式,选一种即可:

方式1:修正getter/setter方法命名(推荐)

严格遵循JavaBean规范:属性名和JSON字段保持一致,getter方法为get+首字母大写的属性名,setter同理。以Response类为例,修正后的代码如下:

public class Response {
    private String productId;
    private byte branchId;
    private long customerNumber;
    private Long subAccountNumber;
    private Byte productType;
    private String openingDate;
    private String closingDate;
    private List<Values> values;
    private List<Instances> instances;
    private List<BranchCustomers> branchCustomers;
    
    // 修正后的getter/setter
    public String getProductId() { return productId; }
    public void setProductId(String productId) { this.productId = productId; }
    
    public byte getBranchId() { return branchId; }
    public void setBranchId(byte branchId) { this.branchId = branchId; }
    
    public long getCustomerNumber() { return customerNumber; }
    public void setCustomerNumber(long customerNumber) { this.customerNumber = customerNumber; }
    
    public Long getSubAccountNumber() { return subAccountNumber; }
    public void setSubAccountNumber(Long subAccountNumber) { this.subAccountNumber = subAccountNumber; }
    
    public Byte getProductType() { return productType; }
    public void setProductType(Byte productType) { this.productType = productType; }
    
    public String getOpeningDate() { return openingDate; }
    public void setOpeningDate(String openingDate) { this.openingDate = openingDate; }
    
    public String getClosingDate() { return closingDate; }
    public void setClosingDate(String closingDate) { this.closingDate = closingDate; }
    
    // 其他方法保持不变
    public List<Values> getValues() { return values; }
    public void setValues(List<Values> values) { this.values = values; }
    public List<Instances> getInstances() { return instances; }
    public void setInstances(List<Instances> instances) { this.instances = instances; }
    public List<BranchCustomers> getBranchCustomers() { return branchCustomers; }
    public void setBranchCustomers(List<BranchCustomers> branchCustomers) { this.branchCustomers = branchCustomers; }
}

同样的,BranchCustomers类的getter/setter也要修正:

public class BranchCustomers {
    private byte branchId;
    private long customerNumber;
    private List<Products> products;
    
    public byte getBranchId() { return branchId; }
    public void setBranchId(byte branchId) { this.branchId = branchId; }
    
    public long getCustomerNumber() { return customerNumber; }
    public void setCustomerNumber(long customerNumber) { this.customerNumber = customerNumber; }
    
    public List<Products> getProducts() { return products; }
    public void setProducts(List<Products> products) { this.products = products; }
}

方式2:使用@JsonProperty注解指定映射关系

如果不想修改方法名,可以在属性或者getter/setter上添加@JsonProperty注解,明确指定对应的JSON字段名。比如:

public class Response {
    @JsonProperty("productId")
    private String partnerId;
    
    @JsonProperty("branchId")
    private byte branchId;
    
    @JsonProperty("customerNumber")
    private long customerNumber;
    
    // 对应的getter也可以加注解,或者只在属性上加即可
    @JsonProperty("productId")
    public String getProductid() { return partnerId; }
    
    // 其他字段同理...
}

不过这种方式不如第一种规范,推荐优先使用方式1。

额外检查

另外,你提供的JSON片段存在语法错误(比如开头多了引号,结尾有多余的}] }], "instances": [] }),确保你实际解析的是合法的JSON字符串,否则也可能导致解析异常或者字段映射失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:17:33