我正在尝试使用杰克逊对物体进行去电
this.prepareCustomMapper().readValue(response.getBody(), EmailResponse.class);
我有这个例外:
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()方法时,有什么方法可以传递此构造函数参数?或者在这种情况下最好的选择是什么?我感谢您的帮助。问候
您可以使用Jackson值注入功能将不属于输入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}