【发布时间】:2019-07-09 19:55:44
【问题描述】:
我们的系统利用 Jackson (Java 11) 从外部源反序列化对象。当我们收到有效载荷时,它是字符串(UTF-8)格式。它无法反序列化并出现异常(MismatchedInputException)
无法构造 'object' 的实例(尽管至少存在一个 Creator):没有 String-argument 构造函数/工厂方法可以从 String 值反序列化('{
堆栈技术:
- Java 11
- 杰克逊 2.9.8
- 谷歌云(平台)
我们最终使用了多个 replaceAll 语句,只是为了使有效负载处于允许将字符串转换为 jackson 中的对象的状态。代码真的很臭……
我不确定这是否有帮助,但有效负载是从 Google PubSub Subscription 中提取的。所以我有一个消息接收器监听订阅。我最初使用的是 Springs JacksonPubSubMessageConverter,但在上面抛出了异常。我自己滚动,在下面添加了 replaceAll(..),现在似乎已经解决了问题。
public class ABCMessageReceiver implements MessageReceiver {
private PubsubMessageConverter converter;
public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
Person person = converter.fromPubSubMessage(message, Person.class);
...
}
}
payload = "{\n \"general\": {\n \"aggregatorId\": \"111111111111\",\n \"communityId\": \"30303030\",\n \"dateStamp\": \"2019-07-09\",\n \"comments\": \"Testing E2E1\"\n },\n \"prospect\": {\n \"firstName\": \"Joe\",\n \"lastName\": \"Smith\",\n \"nickName\": \"\",\n \"email\": \"joe.smith@sample.com\",\n \"gender\": \"MALE\",\n \"maritalStatus\": \"SINGLE\",\n \"dateOfBirth\": \"1956-06-15\",\n \"veteranStatus\": \"NOTAVETERAN\",\n \"address\": {\n \"address1\": \"100 Acme Street \",\n \"address2\": \"Suite 2300\",\n \"city\": \"Acme City\",\n \"state\": \"WI\",\n \"zip\": \"53214\"\n },\n \"phones\": [\n {\n \"number\": \"4145551212\",\n \"type\": \"WORK\"\n }\n ],\n \"financial\": {\n \"budgetAmount\": 2639,\n \"budgetFrequency\": \"MONTHLY\",\n \"medicaid\": true,\n \"medicare\": true,\n \"ltcPolicy\": false,\n \"homeowner\": true,\n \"vaAid\": false\n },\n \"prospectNeeds\": {\n \"desiredCareLevel\": \"AL\"\n }\n },\n \"tour\": {\n \"date\": \"2019-07-14T17:00:00.000Z\",\n \"notes\": \"Testing tour notes 1\"\n }\n}"
payload = payload.replaceAll("\\\\\"", "\"");
payload = payload.replaceAll("\\\\n", "");
payload = payload.substring(1);
payload = payload.substring(0, payload.length()-1);
我不喜欢开销字符串替换,但它现在似乎工作,直到我得到另一个我需要支持的字符串排列。
【问题讨论】:
-
告诉生产者向您发送正确的 JSON。
-
如果您接收到的 JSON 数据已编码为 JSON 字符串,只需使用 Jackson 解码该字符串,然后再次使用 Jackson 解析解码后的字符串。
-
@Andreas 我更新了上面的问题
-
请使用您尝试反序列化的 JSON 更新您的问题。
-
@cassiomolin 我发布了从订阅队列中提取的整个有效负载