杰克逊:UnrecognisedPropertyException

问题描述 投票:1回答:1

我有以下课程:

location custom data item.Java

public class LocationCustomDataItem {

private String attributeNumber;
private String attributeLabel;
private String attributeValue;

public LocationCustomDataItem() {

}

public LocationCustomDataItem(final String attributeNumber, final String attributeLabel, final String attributeValue) {
    this.attributeNumber = attributeNumber;
    this.attributeLabel = attributeLabel;
    this.attributeValue = attributeValue;
}
/**
 * @return the attributeNumber
 */
public String getAttributeNumber() {
    return attributeNumber;
}
/**
 * @param attributeNumber the attributeNumber to set
 */
public void setAttributeNumber(String attributeNumber) {
    this.attributeNumber = attributeNumber;
}
/**
 * @return the attributeLabel
 */
public String getAttributeLabel() {
    return attributeLabel;
}
/**
 * @param attributeLabel the attributeLabel to set
 */
public void setAttributeLabel(String attributeLabel) {
    this.attributeLabel = attributeLabel;
}
/**
 * @return the attributeValue
 */
public String getAttributeValue() {
    return attributeValue;
}
/**
 * @param attributeValue the attributeValue to set
 */
public void setAttributeValue(String attributeValue) {
    this.attributeValue = attributeValue;
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this, false);
}

@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE, false);
}

location custom data attributes.Java

public class LocationCustomDataAttributes {

private final List<LocationCustomDataItem> locationCustomDataItems;

public LocationCustomDataAttributes() {
    this.locationCustomDataItems = new ArrayList<>();
}

public LocationCustomDataAttributes(final List<LocationCustomDataItem> locationCustomDataItems) {
    this.locationCustomDataItems = locationCustomDataItems;
}

/**
 * @return unmodifiable locationCustomDataItems list
 */
public List<LocationCustomDataItem> getLocationCustomDataItems() {
    return Collections.unmodifiableList(this.locationCustomDataItems);
}

/**
 * Adds LocationCustoDataItem to internal collection
 * 
 * @param item LocationCustomDataItem to add to item list
 */
public void addItem(final LocationCustomDataItem item) {
    this.locationCustomDataItems.add(item);
}


@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this, false);
}

@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE, false);
}

和这个测试json:

{
   "locationCustomDataAttributes" : {
      "locationCustomDataItems" : [ {
         "attributeLabel" : "testLabel1",
         "attributeNumber" : "testNumber1",
         "attributeValue" : "testLabel1"
      }, {
         "attributeLabel" : "testLabel2",
         "attributeNumber" : "testNumber2",
         "attributeValue" : "testLabel2"
      } ]
   }
}

我正在尝试使用ObjectMapper将json转换为对象,但它会在“locationCustomDataAttributes”周围抛出一个无法识别的属性异常:

mapper test.Java

@Test
public void test() throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper om =new ObjectMapper();

    LocationCustomDataAttributes actual = om.readValue(json, LocationCustomDataAttributes.class);

    LocationCustomDataAttributes expected = new LocationCustomDataAttributes();
    expected.addItem(new LocationCustomDataItem("testNumber1", "testLabel1", "testValue1"));
    expected.addItem(new LocationCustomDataItem("testNumber2", "testLabel2", "testValue2"));

    assertThat(actual).isEqualTo(expected);
}

错误信息:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "locationCustomDataAttributes" (class com.lmig.ci.fnol.transformer.domain.LocationCustomDataAttributes), not marked as ignorable (one known property: "locationCustomDataItems"])
 at [Source: {"locationCustomDataAttributes" : {"locationCustomDataItems" : [ {"attributeLabel" : "testLabel1","attributeNumber" : "testNumber1","attributeValue" : "testLabel1"},{"attributeLabel" : "testLabel2","attributeNumber" : "testNumber2","attributeValue" : "testLabel2"}]}}; line: 1, column: 36] (through reference chain: com.lmig.ci.fnol.transformer.domain.LocationCustomDataAttributes["locationCustomDataAttributes"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:833)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1096)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1467)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1445)

//等等...`

我没有直接与Jackson合作的大量经验,所以我还没有注释类本身,但是从之前的努力(例如使用Spring控制器)转换自动发生而无需在类上进行注释。在这个看起来不像这种情况的情况下,我在课堂上缺少什么,或者当前的类结构是否由于某种原因而不适合杰克逊的自动转换?

java json jackson jackson-databind
1个回答
1
投票
om.readValue(json, LocationCustomDataAttributes.class)

该行要求从JSON文档中解析LocationCustomDataAttributes对象。但是JSON实际上包含一个包装器对象,该对象具有可以解析为LocationCustomDataAttributes对象的属性。解决方案:

  1. 为包装对象创建一个阅读器。例如。 ObjectReader reader = om .readerFor(LocationCustomDataAttributes.class) .withRootName("locationCustomDataAttributes"); LocationCustomDataAttributes actual = reader.readValue(json);
  2. 定义包装类 class AttributesWrapper { private LocationCustomDataAttributes locationCustomDataAttributes; // add getters, setters, constructors etc } 然后解析它: LocationCustomDataAttributes actual = om .readValue(json, AttributesWrapper.class) .getLocationCustomDataAttributes();
© www.soinside.com 2019 - 2024. All rights reserved.