在进行通用序列化时,是否可以在 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/