gpt4 book ai didi

java - 如何使用 Jackson 反序列化 Map

转载 作者:行者123 更新时间:2023-12-01 14:09:18 28 4
gpt4 key购买 nike

我正在尝试序列化/反序列化 Map<?, ?>使用任意对象作为 Jackson 2.8 版的键。 JSON 对应物应该是一组对,即给定

public class Foo {
public String foo;
public Foo(String foo) {
this.foo = foo;
}
}

public class Bar {
public String bar;
public Bar(String bar) {
this.bar = bar;
}
}

然后
Map<Foo, Bar> map;
map.put(new Foo("foo1"), new Bar("bar1"));
map.put(new Foo("foo2"), new Bar("bar2"));

应该由这个 JSON 表示
[
[ { "foo": "foo1" }, { "bar": "bar1" } ],
[ { "foo": "foo2" }, { "bar": "bar2" } ]
]

所以我做了序列化器部分
public class MapToArraySerializer extends JsonSerializer<Map<?, ?>> {

@Override
public void serialize(Map<?, ?> value, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException {
gen.writeStartArray();
for (Map.Entry<?, ?> entry : value.entrySet()) {
gen.writeStartArray();
gen.writeObject(entry.getKey());
gen.writeObject(entry.getValue());
gen.writeEndArray();
}
gen.writeEndArray();
}

}

但我不知道如何写 JsonDeserializer做相反的工作。有什么建议?

注意:我需要 [ [ "key1", "value1" ], [ "key2", "value2" ] ]能够在 JavaScript 中使用该 JSON 的表示法 new Map( ... )JSON.stringify(map)也会产生那个符号(见 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map)。

澄清一下,这样的 map 将是其他类的字段,例如
public class Baz {

@JsonSerialize(using = MapToArraySerializer.class)
@JsonDeserialize(using = ArrayToMapDeserializer.class, keyAs = Foo.class, contentAs = Bar.class)
Map<Foo, Bar> map;

}

ArrayToMapDeserializer extends JsonDeserializer<Map<?, ?>>是我寻求帮助的地方。

最佳答案

我想出了这个解决方案:

public class ArrayToMapDeserializer extends JsonDeserializer<SortedMap<Object, Object>>
implements ContextualDeserializer {

private Class<?> keyAs;

private Class<?> contentAs;

@Override
public Map<Object, Object> deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
return this.deserialize(p, ctxt, new HashMap<>());
}

@Override
public Map<Object, Object> deserialize(JsonParser p, DeserializationContext ctxt,
Map<Object, Object> intoValue) throws IOException, JsonProcessingException {
JsonNode node = p.readValueAsTree();
ObjectCodec codec = p.getCodec();
if (node.isArray()) {
node.forEach(entry -> {
try {
JsonNode keyNode = entry.get(0);
JsonNode valueNode = entry.get(1);
intoValue.put(keyNode.traverse(codec).readValueAs(this.keyAs),
valueNode.traverse(codec).readValueAs(this.contentAs));
} catch (NullPointerException | IOException e) {
// skip entry
}
});
}
return intoValue;
}

@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property)
throws JsonMappingException {
JsonDeserialize jsonDeserialize = property.getAnnotation(JsonDeserialize.class);
this.keyAs = jsonDeserialize.keyAs();
this.contentAs = jsonDeserialize.contentAs();
return this;
}

}

可以这样使用:
public class Baz {

@JsonSerialize(using = MapToArraySerializer.class)
@JsonDeserialize(using = ArrayToMapDeserializer.class,
keyAs = Foo.class, contentAs = Bar.class)
Map<Foo, Bar> map;

}

关于java - 如何使用 Jackson 反序列化 Map<?, ?> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39509982/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com