gpt4 book ai didi

jackson 无法识别的字段异常,但字段在 JSON 中

转载 作者:行者123 更新时间:2023-12-02 04:57:48 27 4
gpt4 key购买 nike

我正在使用 Spring Integration 来使用带有 JSON 负载的消息。

在我的 Spring 背景下我有

<integration:channel id="jsonToMyMessageConverterChannel"/>
<integration:json-to-object-transformer
type="com.acme.messaging.message.MyMessage"
input-channel="jsonToMyMessageConverterChannel"
output-channel="myMessageUpdateChannel"/>

我的消息相关对象是:

MyMessage.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class MyMessage {

@JsonProperty
private String timestamp;

@JsonProperty("msgs")
private List<Message> messages;

// Getters and Setters...
}

消息.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class Message {

@JsonProperty
private Integer msgId;

@JsonProperty("msgText")
private String text;

// Getters and Setters...
}

当 json 转换器尝试将消息转换为对象时,它失败了

Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "msgs" (Class com.acme.messaging.message.MyMessage), not marked as ignorable

JSON 负载肯定有 msgs,它是一个数组,包含代表 Message.java 类的对象。

鉴于 JSON 具有被提示的字段并且类本身也被注释为忽略未知字段,任何人都可以提出异常发生的原因吗?

更新经过一些调试后,由于某种原因,@JsonProperty("msgs") 注释似乎未被使用。

最佳答案

这对我来说很好......

@Test
public void test() throws Exception {
MyMessages mm = new MyMessages();
MyMessage m = new MyMessage();
m.setMsgId(1);
m.setText("foo");
mm.setMessages(Arrays.asList(m));
mm.setTimestamp("123");
@SuppressWarnings("deprecation")
ObjectToJsonTransformer otjt = new ObjectToJsonTransformer(new ObjectMapper());
Message<?> message = new GenericMessage<MyMessages>(mm);
message = otjt.transform(message);
System.out.println(message);
@SuppressWarnings("deprecation")
JsonToObjectTransformer<MyMessages> jtot = new JsonToObjectTransformer<MyMessages>(MyMessages.class, new ObjectMapper());
message = jtot.transform(message);
mm = (MyMessages) message.getPayload();
System.out.println(mm.getTimestamp());
System.out.println(mm.getMessages().get(0).getText());
}

(我稍微更改了您的类名以避免与 Message<?> 冲突)

导致...

[Payload={"timestamp":"123","msgs":[{"msgId":1,"msgText":"foo"}]}][Headers={timestamp=1373997151738, id=f2425f36-a500-4aee-93a4-e7e0240ce0f1, content-type=application/json}]
123
foo

您是否在类路径上同时使用了 jackson 1.x (codehaus) 和 2.x (fasterxml),并使用了 Spring Integration 3.0.0?

如果它们都在类路径中,SI 将默认使用 Jackson 2.x(它无法理解 1.x 注释)。

或者,我猜 - 您使用的是 Jackson2 (fasterxml) 注释吗? Spring Integration 2.x 使用 Jackson 1 (codehaus)。

编辑:

为了支持Jackson的两个版本,你可以用两个注解来注解类...

    @JsonProperty("msgs")
@com.fasterxml.jackson.annotation.JsonProperty("msgs")
public List<MyMessage> messages;

关于 jackson 无法识别的字段异常,但字段在 JSON 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681917/

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