gpt4 book ai didi

java - JsonParseException : Unexpected character ('i' (code 105)): was expecting double-quote

转载 作者:太空宇宙 更新时间:2023-11-04 10:01:41 24 4
gpt4 key购买 nike

我正在尝试集成 Spring Cloud 流并使用 RabbitMQ 作为代理跨服务发布自定义 Java 对象。我要发布的对象如下所示:

public class AppMessageEnvelope implements Serializable {
...
private Object messageBody;
private Date sentAt = new Date();
...

// setters and getters
}

这只是一个包装对象,原始对象放在messageBody中。我放入 messageBody 中的对象如下所示:

public class Job {
...
private String message;
private Map<MyEnum, String> myMap;
...
}

请注意,AppMessageEnvelopeJob 都位于不同的 model 项目中,该项目在发布者和订阅者 Spring Boot 项目中作为 Maven 依赖项导入,因此模型完全相同。

在生产者中,我将对象发布为:

@EnableBinding(Source.class)
public class JobDistributor {

private final Source jobQueue;

@Autowired
public JobDistributor(Source jobQueue) {
this.jobQueue = jobQueue;
}

public AppMessageEnvelope publishJob(AppMessageEnvelope message) {
LOG.info("Sending message: {}.", message);
jobQueue.output().send(MessageBuilder.withPayload(message).build());
return message;
}
}

在消费者中,我收到的消息为:

@Component
@EnableBinding(Sink.class)
public class JobConsumer {

private final JobManager jobManager;
private final ObjectMapper objectMapper;

@Autowired
public JobConsumer(
JobManager jobManager, ObjectMapper objectMapper) {
this.jobManager = jobManager;
this.objectMapper = objectMapper;
}

@StreamListener(target = Sink.INPUT)
public void processData(AppMessageEnvelope messageEnvelope) {
LOG.info("Envelope received: {}.", messageEnvelope);

try {
TypeReference<Job> mapType = new TypeReference<Job>() {};
Job job = objectMapper.readValue(messageEnvelope.getMessageBody().toString(), mapType);
jobManager.processRequest(job);
} catch (Exception ex) {
LOG.error("Couldn't convert to correct object for processing: {}.", ex);
}
}
}

我尝试使用 TypeReference 将内部对象转换为正确的对象,但出现错误:

JobConsumer - Couldn't convert to correct object for processing: {}.
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
at [Source: (StringReader); line: 1, column: 3]

在消息转换之前,我将其记录下来:

JobConsumer - Envelope received: AppMessageEnvelope{..., messageBody={id=5bf3a7302dbe9c7cf9927c60, jobId=8c0bfcb0b21248e694b5cd52337a1f9e, submittedAt=2018-11-20T06:18:24+0000, lastUpdatedOn=null, message=null, ..., fileContentMap={FILE_BYTES=JVBERi0xLjUKJb/3ov}}, sentAt=Tue Nov 20 11:48:24 IST 2018}

我尝试将ObjectMapper配置为:

@Autowired
private ObjectMapper objectMapper() {
JsonFactory factory = new JsonFactory();
factory.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
return new ObjectMapper(factory);
}

我也尝试使用此启用取消引用字段:

objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

我尝试了 this blog 提供的解决方案和一些类似的问题但没有解决。我错过了什么?

最佳答案

使用下面的 json 转换将 JSON 转换为模型/实体

ObjectMapper objectMapper = new ObjectMapper();
Job job = objectMapper.convertValue(messageEnvelope.getMessageBody().toString(), Job.class);

关于java - JsonParseException : Unexpected character ('i' (code 105)): was expecting double-quote,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53387516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com