Получение нераспознанного исключения свойства, хотя свойство было упомянуто
Я получаю следующее исключение, когда пытаюсь прочитать поступающее строковое сообщение.
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "EventID" (class org.json.JSONObject), not marked as ignorable (0 known properties: ])
at [Source: {"MessageType": "EventSubscription","MessageData": {"EventID": ["ProximitySensorInRange", "ProximitySensorOutOfRange", "BarcodeBarcodeScanned", "RFIDRFIDScanned", "EXTERNALRFIDEXTERNALRFIDScanned", "ButtonsButtonPressed", "TestClientEvent", "ApplicationInteractionDetected", "ProductAdditionMethodBarcode", "ProductAdditionMethodRFID", "ProductAdditionMethodSearchAndAdd", "KohlsOfferKohlsCashUsed", "KohlsOfferGiftCardUsed", "KohlsOfferPromoCodesUsed", "SearchInputKeyedIn", "SearchInputVoice", "KubeUsageTime", "ProductAdditionMethodRecommendation", "ProductAdditionMethodUPCSearch"]}}; line: 1, column: 65] (through reference chain: com.kube.dataobjects.HostEventObject["MessageData"]->org.json.JSONObject["EventID"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:731)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:915)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1292)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1270)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:247)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:106)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2146)
at com.kube.websocketserver.KubeWebSocketServer.onMessage(KubeWebSocketServer.java:80)
at org.java_websocket.server.WebSocketServer.onWebsocketMessage(WebSocketServer.java:469)
at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:368)
at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:157)
at org.java_websocket.server.WebSocketServer$WebSocketWorker.run(WebSocketServer.java:657)
Вот как я читаю сообщение.
hostEvent = mapper.readValue(message,HostEventObject.class);
Это мой класс HostEventObject.
public class HostEventObject {
public static final String MESSAGETYPE_SUBSCRIPTION = "eventsubscription";
public static final String MESSAGETYPE_EVENTFIRED = "eventfired";
public static final String MESSAGETYPE_FIREEVENT = "fireevent";
@JsonProperty("APIVersion")
private String APIVersion;
@JsonProperty("EventTime")
private String EventTime;
@JsonProperty("MessageType")
public String MessageType;
@JsonProperty("MessageData")
public JSONObject MessageData;
}
Ниже дано мое строковое сообщение JSON.
{
MessageType: "EventSubscription",
MessageData: {
EventID: ["test1","test2"]
}
}
Почему я получаю это исключение? Я читал подобные вопросы, но я не делаю ошибок правописания, и я не могу игнорировать это свойство. Пожалуйста посоветуй.
2 ответа
MessageData имеет тип JSONObject, который не имеет поля с именем EventID. Возможно, вы хотели поставить здесь другой класс?
Это твой JSON
MessageData: {
EventID: ["test1","test2"]
}
Для которого требуется, чтобы тип данных для данных сообщения имел поле EventID, которое является своего рода списком / множеством / массивом или другим набором строк. Но то, что у нас есть -
@JsonProperty("MessageData")
public JSONObject MessageData;
ОБНОВЛЕНИЕ Похоже, что для организации JSON существует модуль Джексона: см. https://github.com/FasterXML/jackson-datatype-json-org. Для регистрации модуля вы можете использовать это:-
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JsonOrgModule());
Кажется, в вашем POJO отсутствует свойство EventID. Вы можете решить это 2 способами
Добавьте недвижимость в java POJO.
Поместите код, чтобы игнорировать указанное выше свойство, которое может быть достигнуто двумя способами:
а. Отметьте POJO, чтобы игнорировать неизвестные свойства
@JsonIgnoreProperties(ignoreUnknown = true)
б. Сконфигурируйте ObjectMapper, который сериализует / десериализует POJO/json, как показано ниже:
ObjectMapper mapper =new ObjectMapper(); mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);