java - Jackson - ObjectMapper 重命名一些有关规则的字段名称

标签 java serialization jackson

在进行通用序列化时,是否可以在 ObjectMapper 中添加一些智能来重命名以下用例中的某些 Json 字段:

byte[] data
...
read(mapper.readValue(data, Map.class)

一条规则可能类似于“如果字段包含符号“@”,则将 @ 替换为“at_””?

编辑1:

为了提供详细信息,假设我有以下字符串: String str = "{'name' : 'foo', '@somefield':'bar'}"

我使用 ObjectMapper 将其转换为上面定义的映射对象:

 Map<String, String> map =  mapper.readValue(str.bytes(), Map.class)

但是我想知道是否可以在ObjectMapper的readValue过程中进行一些过滤/重命名,例如删除字段名称的@符号。

结果将是一个包含以下字段的 map :

'name' : 'foo' 
'somefield' : 'bar' 

最佳答案

您可以使用StdDesiralizer

当然,您将不得不忍受数据结构的各种选项(字段、数字等之一中的嵌套列表),但至少这是一个可行的选项。

附注您可以使用annotation使代码更简洁。

  public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module =
            new SimpleModule("CustomJsonDeserializer", new Version(1, 0, 0, null, null, null));
    module.addDeserializer(Map.class, new CustomJsonDeserializer());
    mapper.registerModule(module);

    String str = " {\"name\" : \"foo\", \"@somefield\":\"bar\"}";
    Map<String, String> map = mapper.readValue(str.getBytes(), Map.class);
    for (Map.Entry<String, String> e : map.entrySet()) {
        System.out.printf("'%s' : '%s'\n", e.getKey(), e.getValue().toString());
    }
}

public static class CustomJsonDeserializer extends StdDeserializer {

    public CustomJsonDeserializer() {
        this(null);
    }

    public CustomJsonDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Map<String, String> deserialize(JsonParser parser, DeserializationContext deserializer)
            throws IOException {
        Map<String, String> map = new HashMap<>();
        ObjectCodec codec = parser.getCodec();
        JsonNode nodes = codec.readTree(parser);
        Iterator<Map.Entry<String, JsonNode>> iterator = nodes.fields();
        while (iterator.hasNext()) {
            Map.Entry<String, JsonNode> entry = iterator.next();
            String key = entry.getKey();
            if (key.contains("@")) {
                key = key.replace("@", "at_");
            }
            map.put(key, entry.getValue().textValue());
        }
        return map;
    }
}

输出:

'name' : 'foo'

'at_somefield' : 'bar'

关于java - Jackson - ObjectMapper 重命名一些有关规则的字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431982/

相关文章:

json - 使用Serde反序列化嵌套JSON结构时的“invalid type: map, expected a sequence”

java - jackson 是否会错误地序列化任何货币值(value)?

java - 从 JSON 字符串构建 Spring ResponseEntity 对象

javascript - 可以是 String 或 Boolean 的 Spring 和 Json 字段映射

java - 上传文件使用 HttpUrlConnection 时出错

python - 在使用 django restframework 多数据库时,serializer.is_valid() 总是去默认数据库进行验证

json - 预期对象或值 : Importing JSON into Python (Pandas)

rest - JAXB Jackson - 如何处理 map ?

java - 在检索重定向 url 之前使用 Apache HttpHead 进行 URI 编码

java - Ipad 应用程序 - 访问基于 java 的 Web 服务器