Spring Boot中Jackson反序列化遇UnrecognizedPropertyException求助
Hey there! Let's break down why you're seeing that UnrecognizedPropertyException for the "sections" field when deserializing JSON to your Java DataBlock object, and how to fix it.
What's Causing This?
This error happens because Jackson can't find a matching field (or proper access to it) in your DataBlock class for the "sections" key present in your JSON. Either the field is missing entirely, named incorrectly, or Jackson can't access it to populate the data.
Step-by-Step Solutions
1. Verify Your Java Class Has the "sections" Field
First, double-check that your DataBlock class includes a sections field with the correct type (since your JSON has an array, it should be a List of your section objects). For example:
public class DataBlock { // Make sure this field exists and matches the JSON array type private List<Section> sections; // Your other fields: prompt, id, name private String prompt; private int id; private String name; // ... getters and setters below } // Don't forget the Section class for the nested objects public class Section { private String info; private String prompt; private String name; private int sequence; private List<Object> fields; // Use your actual field type if different private List<Object> gatingConditions; private String guid; private int id; // ... getters and setters }
2. Ensure Getters/Setters Are Present
Jackson relies on getters and setters to access fields during deserialization. If you're writing them manually, make sure you have:
public List<Section> getSections() { return sections; } public void setSections(List<Section> sections) { this.sections = sections; }
If you use Lombok, adding @Data to both DataBlock and Section classes will auto-generate these methods for you.
3. Ignore Unknown Fields (If You Don't Need "sections")
If your DataBlock class doesn't need the "sections" data and you want to suppress this error entirely, add the @JsonIgnoreProperties annotation to your class:
@JsonIgnoreProperties(ignoreUnknown = true) public class DataBlock { // Your existing fields }
For a global fix (applies to all deserialization), configure your ObjectMapper in a Spring config class:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { return new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } }
4. Fix Field Naming or Access Issues
If your Java field is named differently (e.g., sectionList instead of sections) or Jackson can't access it (private field without getters/setters), use the @JsonProperty annotation to map it explicitly:
@JsonProperty("sections") private List<Section> sectionList; // Maps JSON "sections" to this Java field
This also works if you have case mismatches (e.g., Java field is Sections but JSON is sections).
Quick Example of a Working Setup
Here's a complete, simplified example using Lombok to avoid boilerplate:
import lombok.Data; import java.util.List; @Data public class DataBlock { private List<Section> sections; private String prompt; private int id; private String name; } @Data public class Section { private String info; private String prompt; private String name; private int sequence; private List<Object> fields; private List<Object> gatingConditions; private String guid; private int id; }
With this setup, Jackson should properly deserialize your JSON into the DataBlock object without throwing the UnrecognizedPropertyException.
内容的提问来源于stack exchange,提问作者mmaceachran

