Jackson JsonParser readValueAs Multimap

时间:2016-07-25 21:42:35

标签: java json jackson guava

我正在尝试使用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>

2 个答案:

答案 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;
    }
}