繁体   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