【发布时间】:2019-12-01 13:54:13
【问题描述】:
如何使用 jackson(Java) 在 Object 中反序列化 json 对象(在我的情况下,Offer 对象存在于 current 字段中)?
输入字符串:
message.getMessage();
{"header":"OFFER","message":"{\"author\":\"Peter Smith\",\"previous\":null,\"current\":{\"id\ ":\"eOUQieQdvB\",\"authorUserId\":\"foo\"}}"}
ObjectMapper mapper = new ObjectMapper();
PushEventMessage<PushEvent<Offer>> pushEventMessage = mapper.readValue(message.getMessage(), PushEventMessage.class);
pushEventMessage.getMessage();
{"author":"Peter Smith","previous":null,"current":{"id":"eOUQieQdvB","authorUserId":"foo"}}
PushEvent<Offer> pushEvent = mapper.readValue(pushEventMessage.getMessage(), PushEvent.class);
pushEvent.getAuthor(); // is OK and contain "Peter Smith"
pushEvent.getCurrent() // is KO and contain {id=eOUQieQdvB, authorUserId=foo}
我要反序列化:
Offer offer= mapper.readValue(pushEvent.getCurrent() + "", Offer.class);
我的错误是:
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
at [Source: (String)"{id=eOUQieQdvB, authorUserId=foo,
EDIT 1,我添加PushEvent<T> 类。
import lombok.*;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PushEvent<T> {
String author;
T previous;
T current;
String error;
}
EDIT 2,我试试这个,但结果是一样的
PushEvent<Offer> pushEvent = mapper.readValue(pushEventMessage.getMessage().replaceAll("\\\"", "\""), PushEvent.class);
我采用@Smutje 的解决方案,这解决了第一个问题。!!
编辑 3,我在 Offer 对象中有一个 java.time.ZonedDateTime。
{"author":"Peter Smith","previous":null,"current":{"id":"00Yno9WwsL","authorUserId":"foo","createdAt":{"offset":{ "totalSeconds":0,"id":"Z","rules":{"transitionRules":[],"transitions":[],"fixedOffset":true}},"zone":{"id": "UTC","rules":{"transitionRules":[],"transitions":[],"fixedOffset":true}},"dayOfMonth":11,"dayOfWeek":"SUNDAY","dayOfYear":42 ,"月":"二月","年":2018,"小时":1,"分钟":0,"纳米":0,"秒":0,"月值":2,"年表":{ "id":"ISO","calendarType":"iso8601"}}}}
我有这个错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.ZonedDateTime` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"id":"00Yno9WwsL","authorUserId":"foo", ....."createdAt":{"offset":{"totalSeconds":0,...
EDIT 4,我添加Offer 类。
@Slf4j
@Data
@NoArgsConstructor
public class Offer {
@Id
protected String id;
protected String authorUserId;
protected ZonedDateTime createdAt;
}
【问题讨论】:
-
pushEvent.getCurrent()有什么返回类型? -
为什么不用另一个 POJO?无法反序列化为
Offer,因为它没有id,还有剩余字段,你能显示Offer类吗? -
@Smutje,在我的例子中是 LinkedHashMap,因为所有双引号都被撤销(我不知道为什么?)我想要一个对象“Offer”。
-
请添加您的“PushEvent”类。
-
@Smutje,我用
PushEvent<T>class 编辑了我的问题。