TreeMap 的自定义反序列化器 - 无法通过 JsonParser 获取全文

Custom deserializer for TreeMap - cannot get full text by JsonParser

我有一个 class 定义如下:

class Rule {
    private final TreeMap<String, String> rule;
    public Rule(TreeMap<String, String> rule) {
        this.rule = rule;
    }
}

另一个 class 包含此类对象的列表:

class BigClass {
    
    @JsonProperty("rules")
    @JsonDeserialize(contentUsing = Rule.Deserializer.class)
    private final List<Rule> rules;

    //...

}

...并且如 @JsonDeserialize 注释中所指定,我希望此类列表的内容由自定义反序列化程序处理。

为此,我扩展了 JsonDeserializer<Rule> 如下:

public static final class Deserializer extends JsonDeserializer<Rule> {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Rule deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String strRule = p.getText();
        TypeReference<TreeMap<String, String>> typeReference = new TypeReference<>() {
        };

        TreeMap<String, String> ruleMap = objectMapper.readValue(strRule, typeReference);
        return new Rule(ruleMap);
    }
}

当我尝试解析具有以下结构的 BigClass 类型的 Json 时:

{
    ...
    "rules": [
        {
            "A": "B",
            "C": "D",
            "E": "F" 
        }
    ]
}

...我在自己的 deserialize() 方法中被正确调用,但问题是表达式 p.getText() 仅 return 是我 {(非常第一个标记),因此反序列化失败。

我试过将所有内容都放在同一行(没有回车return),但我遇到了同样的问题。 这似乎是显而易见和简单的事情,但我在网络上和 Jackson 文档中都找不到任何示例。 有什么建议或参考可以分享吗?

按如下方式更改您的反序列化方法: 您在反序列化步骤中读取整个 JsonNode,并根据您在节点中找到的键值构建您自己的 TreeMap。 (您可能必须向规则添加构造函数 class)

@Override
  public Rule deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
    JsonNode node = p.getCodec().readTree(p);
    TreeMap<String, String> ruleMap = new TreeMap<>();
    node.fields().forEachRemaining(e -> ruleMap.put(e.getKey(), e.getValue().textValue()));

    return new Rule(ruleMap);
  }