簡體   English   中英

如何反序列化json以在java中使用jackson進行枚舉?

[英]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 ,而是SetField接口。

你需要告訴 Jackson 你想要什么樣的Set和什么樣的Field ,你可以通過注釋該屬性來做到這一點:

@JsonDeserialize(as = EnumSet.class, contentAs = BField.class)

最后我找到了解決方案。

  1. 我在上下文中刪除了<mvc:annotation-driven/>
  2. 為字段private Set<Field> f;添加@JsonDeserialize(as = EnumSet.class)注釋private Set<Field> f; 在 C 班。
  3. 在模塊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); } }
  4. 在模塊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; } }
  5. 小心使用fastxml jackson而不是codehaus 庫!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM