【问题标题】:Jackson include a key that is empty string杰克逊包含一个空字符串的键
【发布时间】:2021-11-08 05:34:57
【问题描述】:

我从服务器接受这样的 json:

{
  "": "hello"
}

在杰克逊我做到了

@JsonProperty("")

private String string

当反序列化对象时,它会完全忽略该属性。 如何将空字符串计为键?

谢谢

【问题讨论】:

  • @Jens 我也这么认为,但我刚刚检查了the grammar,空字符串与members 的键匹配。
  • 是的。它谈论枚举。我无法申请我的案子……我只想序列化对象。只需像对待任何其他字符串一样对待空字符串。有意义吗?

标签: java json jackson


【解决方案1】:

我找到了一种通过以下步骤使用自定义反序列化器实现您想要的方法。

第 1 步:创建要反序列化到的 POJO 类

public class MyPojo {
    private String emptyFieldName;

    //constructor, getter, setter and toString
}

第 2 步:创建您的自定义反序列化程序

public class MyDeserializer extends StdDeserializer<MyPojo> {
    public MyDeserializer () {
        this(null);
    }

    protected MyDeserializer (Class<?> vc) {
        super(vc);
    }

    @Override
    public MyObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
        String emptyFieldName = jsonNode.get("").asText();

        return new MyPojo(emptyFieldName);
    }
}

第 3 步:注册此自定义反序列化程序

ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(MyPojo.class, new MyDeserializer());
objectMapper.registerModule(module);

MyPojo myPojo = objectMapper.readValue(jsonStr, MyPojo.class);
System.out.println(myPojo.getEmptyFieldName());

控制台输出:

你好


顺便说一句,你也可以直接在类上注册这个自定义反序列化器:

@JsonDeserialize(using = MyDeserializer.class)
public class MyPojo {
    ...
}

更多信息请参考Getting Started with Custom Deserialization in Jackson

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多