我正在尝试使用StdDeserializer<T>
实现自定义反序列化器。在我的deserialize(JsonParser, DeserializationContext)
方法中,考虑到JSON字符串为JsonParser
,我尝试使用{ "toMap": { "a": "b", "a": "c" } }
来读取Multimap
。
假设我正处于字段名称为"toMap"
的位置,我试图这样做:Multimap<String, Object> rawConditions = jsonParser.readValuesAs(new TypeReference<LinkedListMultimap<String, Object>>() {});
但它会导致编译错误。它说他们有不兼容的类型 - 需要Multimap<String, Object>
,但它找到Iterator<Object>
。
答案 0 :(得分:0)
Guava的Multimap<K, V>
大致相当于Map<K, Collection<V>>
,但在您的数据({ "toMap": { "a": "b", "a": "c" } }
)中,您有Map<K, Map<V, X>>
,当然,无法将其反序列化为Multimap
。如果您坚持使用Guava,可以将其反序列化为Table
。当然,我假设您使用jackson-datatypes-collections
并在GuavaModule
中注册了ObjectMapper
。
编辑:如果您想将“toMap”值反序列化为多图(即{ "a": "b", "a": "c" }
),它也无效Multimap<K, V>
(或Map<K, Collection<V>>
如果您愿意),而是Map<K, V>
:
"a"
,{ "a": ["b"], "x": ["c"] }
一样有效Multimap
。尝试将其反序列化为Map<String, String>
。
答案 1 :(得分:0)
我不知道有任何用于多图的内置转换器,但假设您在示例中寻找的多图是{ "a": "b", "a": "c" }
(没有“toMap”),并且您希望它转换为类似的{"a": ["b", "c"]}
,您可以通过按令牌解析json令牌并将其添加到您的多图来编写自己的反序列化器。示例:
public class CustomDeserializer extends JsonDeserializer<Multimap<String, String>> {
@Override
public Multimap<String, String> deserialize(JsonParser jp, DeserializationContext dc)
throws IOException {
Multimap<String, String> multimap = LinkedListMultimap.create();
JsonToken currentToken = null;
while ((currentToken = jp.nextValue()) != null) {
switch (currentToken) {
case VALUE_STRING:
multimap.put(jp.getCurrentName(), jp.getText());
break;
}
}
return multimap;
}
}