Java使用Jackson解析JSON时字段取值全为null问题求助
问题排查与解决
你遇到的所有字段返回null是以下几个原因导致的:
- POJO类访问权限不足:
ROOT、PickEvent类没有加public修饰符,属于包级私有,Jackson默认无法访问这些类的属性和lombok生成的get/set方法,无法完成赋值。 - 字段名与JSON不匹配:
PickEvent类中对应JSON的containerId字段被误写为ContainedId,拼写错误+首字母大写不符合Jackson默认的字段名匹配规则,导致无法映射。 - 字段访问权限问题:
PickEvent类的所有属性没有修饰符,属于包级私有,lombok的@Data注解只会为私有字段生成public的get/set方法,默认权限的字段不会生成公共访问方法,Jackson无法写入值。
修正方案
- 给所有POJO类添加
public修饰符,字段修改为private,修正错误的字段名:
修正后的ROOT类:
package JsonDiff; import lombok.Data; @Data public class ROOT { private PickEvent[] pickEventActivities; }
修正后的PickEvent类:
package JsonDiff; import lombok.Data; import java.util.List; @Data public class PickEvent { private String orderId; // 也可以改为Integer类型和JSON的数字类型完全匹配 private String lineNbr; private String pickByType; private String pickGtin; // 修正字段名和JSON完全对齐 private String containerId; private String pickedUser; private List<Activation> activations; }
- 可选:如果你不想修改字段的修饰符,可以在初始化
ObjectMapper时添加可见性配置,让Jackson直接访问字段完成赋值:
final ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 新增以下配置,允许Jackson访问所有字段,不管访问权限 objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
修改完成后重新运行即可得到预期输出。
内容的提问来源于stack exchange,提问作者Lorea
相关产品推荐
相关产品推荐

