[英]How to deserialize json to enum with jackson in java?
我有一個名為 Field 的接口,如下所示:
public interface Field {
}
該接口位於模塊A 中。 我有一個名為 BField 的枚舉,它在模塊B 中,實現如下:
public enum BField implements Field {
SOME_FIELD
}
模塊A 中有一個名為 C 的類,如下所示:
public class C implements Serializable {
private Set<Field> f;
public Set<Field> getF() { return f; }
public void setF(Set<Field> f) { this f = f; }
}
我有一個 REST 方法如下:
@RequestMapping(method=RequestMethod.Post, value="/save")
@ResponseBody
public void save (@RequestBody C c) {
//save c
}
我將此 JSON 對象發送到此方法:
{
"f": ["SOME_FIELD"]
}
然后我收到帶有以下異常日志的 HTTP 400 錯誤請求錯誤代碼:
抽象類型只能用附加類型信息實例化
模塊的層次結構是模塊B依賴於模塊A 。 我嘗試使用@JsonTypeInfo,但模塊之間的依賴是一個限制,不允許我在類 C 中的字段 f 的 @JsonSubTypes 注釋中使用 BField.class。
這里的問題不是enum
,而是Set
和Field
接口。
你需要告訴 Jackson 你想要什么樣的Set
和什么樣的Field
,你可以通過注釋該屬性來做到這一點:
@JsonDeserialize(as = EnumSet.class, contentAs = BField.class)
最后我找到了解決方案。
<mvc:annotation-driven/>
private Set<Field> f;
添加@JsonDeserialize(as = EnumSet.class)
注釋private Set<Field> f;
在 C 班。在模塊B 中創建一個名為 JsonBFieldDeserializer 的類,如下所示:
public class JsonBFieldDeserializer extends StdDeserializer<Field> { public JsonBFieldDeserializer() { this(null); } public JsonBFieldDeserializer(Class<?> vc) { super(vc); } @Overrid public Field deserialize(JsonParser jsonParser, DeserializationContext dC) throws IOException, JsonProcessingException { JsonNode node = jsonParser.getCodec().readTree(); String text = node.asText(); return BField.valueOf(text); } }
在模塊B 中創建一個名為 BConfiguration 的類,如下所示:
@Configuration public class BConfiguration extends WebMVCConfigurationSupport { protected void configureMessageConverters(List<HttpMessageConverters<?>> converters){ converters.add(convert()); addDefaultHttpMessageConverters(converters); } @Bean MappingJackson2HttpMessageConverter convert(){ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(Field.class, new JsonBFieldDeserializer()); objectMapper.registerModule(module); converter.setObjectMapper(objectMapper); return converter; } }
小心使用fastxml jackson而不是codehaus 庫!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.