我有JSON反序列化和映射到枚举的问题。我从外部API获取JSON,类似于下面两个例子:
{
"someValue": null
}
{
"someValue": "exists"
}
我想将空值映射到一些默认的枚举值。
模型对象
SomeEnum someValue;
和枚举类
public enum SomeEnum {
@JsonProperty("exists") EXISTS,
NONE;
}
对于exists,值模型类包含正确的枚举,但如果我从API获取< code>null,它在模型中仍然是< code>null。
我试图创建一些由< code>@JsonCreator注释的方法,使用< code > @ JsonEnumDefaultValue 创建自己的枚举反序列化程序,但是这些解决方案都不适合我。有人知道吗,我如何将空值反序列化为默认枚举?
将字段的起始值设置为枚举的值。
java prettyprint-override">public class ExampleClass {
@JsonProperty("someValue") public SomeEnum someValue = SomeEnum.NONE;
public enum SomeEnum {
@JsonProperty("exists") EXISTS,
NONE;
}
}
但是,这意味着如果该值不存在,它也将是与指定< code>null相同的值。所以这两个JSON字符串将产生相同的POJO:
{}
{"someValue":null}
不确定这种行为是否是你想要的。
好了,现在我通过创建自定义枚举反序列化器解决了这个问题。
class SomeEnumDeserializer extends StdDeserializer<SomeEnum> {
SomeEnumDeserializer() {
super(SomeEnum.class);
}
@Override
public SomeEnum getNullValue(DeserializationContext ctxt) {
return SomeEnum.NONE;
}
@Override
public SomeEnum deserialize(JsonParser p, DeserializationContext ctxt) {
// implementation here
}
并使用@JsonDeserialize进行注册:
@JsonDeserialize(using = SomeEnumDeserializer.class)
public enum SomeEnum {
// code
}
但我仍然更喜欢使用类似@JsonProperty的东西,但对于null,就像@JsonNullProperty或类似这样的东西。
(老实说,我在这里编写了这段代码,没有对其进行测试,也许您需要对其进行一些修改。)
您可以尝试执行以下操作(Enum
使用构造函数并使用@JsonCreator
):
public enum SomeEnum {
EXISTS("exists"),
NONE(null);
private String value;
SomeEnum (String value) {
this.value = value;
}
@JsonCreator
public static SomeEnum fromValue(String value) {
for (SomeEnum someEnum : SomeEnum.values()) {
if (StringUtils.equalsIgnoreCase(someEnum.getValue(), value)) {
return someEnum;
}
}
throw new IllegalArgumentException("Unknown value " + value);
}
public String getValue () {
return value;
}
}
如果不起作用,请保留上面的枚举,并尝试制作一个自定义转换器(不带Jackson),如下所示
如果使用Spring靴,则应将此活页夹放在控制器中
@InitBinder
public void initBinder(final WebDataBinder webdataBinder) {
webdataBinder.registerCustomEditor(SomeEnum.class, new SomeEnumConverter());
}
以下是自定义转换器,用于指定如何将输入值转换为枚举值。
public class SomeEnumConverter extends PropertyEditorSupport {
@Override
public void setAsText(final String text) {
setValue(SomeEnum.fromValue(text));
}
}
问题内容: 我正在尝试并且未能对Jackson 2.5.4的枚举进行反序列化,并且我不太清楚我的情况。我的输入字符串是驼峰式的,我想简单地映射到标准的Enum约定。 我也尝试了吸气剂,但没有成功,这是我在其他地方看到的一种选择。他们都炸毁了: 我究竟做错了什么? 问题答案: 编辑: 从Jackson 2.6开始,您可以在枚举的每个元素上使用以指定其序列化/反序列化值(请参见此处): (此答案的其余
我正在尝试从整数值反序列化scala枚举。 当我尝试反序列化这个字段时,它会抛出一个错误-的值com.example.TestEnum$JsonToken.VALUE_NUMBER_INT 我看到jackson doc建议在java中使用JsonCreator,但是没有提到scala enum。 我使用默认的ScalaMapper没有任何定制在这里。
我正在尝试使用jackson-DataBind Objectmapper反序列化一个JSON字符串,其中包含一组枚举属性。当JSON中出现未在枚举中定义的未知属性时,就会发生这种情况。请在下面找到我正在使用的对象映射器配置。 但是,反序列化(ObjectMapper.ReadValue(jsonText,.class);)抛出此错误。“test”是要反序列化的JSON字符串中的未知属性。 Com.
问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因
我使用的是JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@jsonValue,这似乎完成了它将对象序列化为:
问题内容: 考虑以下枚举和类: 并考虑以下主要功能: 当前,该主输出为: 这种输出并不适合我,因为除了字符串的,我想它是,这是序号值在枚举。 所以我想要得到的实际结果是: 有一些优雅的方法可以使其表现为这种方式吗? 问题答案: 它应该通过指定映射器来工作。 如注解的Javadoc所述,这也适用于反序列化: 注意:当用于Java枚举时,一个附加功能是带注释的方法返回的值也被视为要反序列化的值,而不仅