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
相关产品推荐
相关产品推荐

