【问题标题】:Jackson JsonParser readValueAs MultimapJackson JsonParser readValueAs Multimap
【发布时间】:2016-07-25 21:42:34
【问题描述】:

我正在尝试使用StdDeserializer<T> 实现自定义反序列化器。在我的deserialize(JsonParser, DeserializationContext) 方法中,我尝试使用JsonParser 读取Multimap,因为JSON 字符串是{ "toMap": { "a": "b", "a": "c" } }

假设我处于字段名称为 "toMap" 的位置,我尝试这样做:Multimap<String, Object> rawConditions = jsonParser.readValuesAs(new TypeReference<LinkedListMultimap<String, Object>>() {}); 但它会导致编译错误。它说它们的类型不兼容 - 需要 Multimap<String, Object>,但它正在寻找 Iterator<Object>

【问题讨论】:

  • 您能否更具体一些,并在解析您的示例输入后写下您的Multimap 中应该包含的内容?
  • 我添加了一个答案。但是,如果您在序列化方面有任何控制权,最好使用 {"a": ["b", "c"]} 而不是 { "a": "b", "a": "c" }

标签: java json jackson guava


【解决方案1】:

Guava 的Multimap<K, V> 大致相当于Map<K, Collection<V>>,但在您的数据({ "toMap": { "a": "b", "a": "c" } })中,您有Map<K, Map<V, X>>,当然,它不能反序列化为Multimap。如果坚持使用Guava,可以反序列化为Table。当然,我假设您使用jackson-datatypes-collections 并在ObjectMapper 中注册了GuavaModule

EDIT:如果您想将“toMap”value反序列化为多图(即{ "a": "b", "a": "c" }),它也无效Multimap<K, V>(或@987654334 @如果你愿意)而是Map<K, V>

  • 它有重复的键"a"
  • 它应该类似于{ "a": ["b"], "x": ["c"] } 才能成为有效的Multimap

尝试将其反序列化为Map<String, String>

【讨论】:

  • 除了“a”键是重复的,所以可以解释为multimap。
  • @Joel 如果 OP 想要 "toMap" value 被解析,它也不是一个有效的 Multimap<K, V> (或者 Map<K, Collection<V>> 如果你愿意)而是 Map<K, V> .
  • 不这么认为。 { "a": "b", "a": "c" } 可以解释为 {"a": ["b", "c"]} ,您同意,它可以作为多图。数据只是数据。你可以随心所欲地解释它。
  • 我认为 jackson-datatypes-collections 中没有针对 Jackson 的这种格式的反序列化器 - 看起来像是一些特定的用例。
【解决方案2】:

我不知道任何用于多图的内置转换器,但假设您在示例中寻找的多图是 { "a": "b", "a": "c" }(没有“toMap”),并且您希望它转换为类似 @987654322 @,您可以通过逐个令牌解析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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2015-02-02
    • 1970-01-01
    相关资源
    最近更新 更多