gpt4 book ai didi

java - 如何用 jackson 传递构造函数参数?

转载 作者:行者123 更新时间:2023-11-29 06:33:17 25 4
gpt4 key购买 nike

我正在尝试使用 Jackson 对一个对象进行反序列化

this.prepareCustomMapper().readValue(response.getBody(), EmailResponse.class);

我有这个异常(exception):

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.despegar.social.automation.services.emailservice.response.EmailResponse]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: java.io.StringReader@4f38f663; line: 1, column: 12] (through reference chain: com.despegar.social.automation.services.emailservice.response.EmailsResponse["items"])
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:746)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:683)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)

我知道这是因为这是我的构造函数:

public class EmailResponse extends MyServiceResponse {

private String id;
private String user_id;
private String email;
private Boolean is_primary;
private Boolean is_confirmed;

public EmailResponse(HttpResponse request) {
super(request);
}
}

所以,我的构造函数接收到 HttpResponse 参数,但我没有传递它,但我不知道该怎么做。我不能用一个空的构造函数多收费,因为我需要它以这种方式接收 HttpResponse 对象。当我调用 readValue() 方法时,有什么方法可以传递这个构造函数参数吗?或者在这种情况下最好的选择是什么?我感谢您的帮助。问候

最佳答案

您可以使用 the Jackson value injection feature将不属于输入 JSON 的对象引用作为构造函数参数传递。这是一个例子:

public class JacksonInjectExample {
private static final String JSON = "{\"field1\":\"value1\", \"field2\":123}";

// HttpResponse in your case
public static class ExternalObject {
@Override
public String toString() {
return "MyExternalObject";
}
}

public static class Bean {
// make fields public to avoid writing getters in this example
public String field1;
public int field2;

private ExternalObject external;

public Bean(@JacksonInject final ExternalObject external) {
this.external = external;
}

@Override
public String toString() {
return "Bean{" +
"field1='" + field1 + '\'' +
", field2=" + field2 +
", external=" + external +
'}';
}
}

public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue(ExternalObject.class, new ExternalObject());
mapper.setInjectableValues(injectableValues);

final Bean bean = mapper.readValue(JSON, Bean.class);
System.out.println(bean);
}
}

输出:

Bean{field1='value1', field2=123, external=MyExternalObject}

关于java - 如何用 jackson 传递构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27133161/

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