Java 树映射的自定义反序列化程序-无法通过JsonParser获取全文

Java 树映射的自定义反序列化程序-无法通过JsonParser获取全文,java,jackson,json-deserialization,Java,Jackson,Json Deserialization,我有一个定义如下的类: class Rule { private final TreeMap<String, String> rule; public Rule(TreeMap<String, String> rule) { this.rule = rule; } } 当我尝试用以下结构解析BigClass类型的Json时: { ... "rules": [ {

我有一个定义如下的类:

class Rule {
    private final TreeMap<String, String> rule;
    public Rule(TreeMap<String, String> rule) {
        this.rule = rule;
    }
}
当我尝试用以下结构解析
BigClass
类型的Json时:

{
    ...
    "rules": [
        {
            "A": "B",
            "C": "D",
            "E": "F" 
        }
    ]
}
。。。在我自己的
反序列化()
方法中正确地调用了我,但问题是表达式
p.getText()
只返回我
{
(第一个标记),因此反序列化失败

我试着把所有的东西放在同一条线上(没有回车),但我也有同样的问题。 这看起来很明显,很简单,但我在网上和杰克逊的文档中都找不到任何例子。
请提供任何建议或参考以供分享?

更改您的反序列化方法,如下所示: 在反序列化步骤中,您阅读了整个
JsonNode
,并基于在节点中找到的键值构建了自己的
TreeMap
。(您可能需要向规则类添加构造函数)

@覆盖
公共规则反序列化(JSONP,反序列化上下文ctxt)引发IOException{
JsonNode node=p.getCodec().readTree(p);
TreeMap ruleMap=newtreemap();
node.fields().forEachRemaining(e->ruleMap.put(e.getKey(),e.getValue().textValue());
返回新规则(ruleMap);
}
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);
    }
}
{
    ...
    "rules": [
        {
            "A": "B",
            "C": "D",
            "E": "F" 
        }
    ]
}
@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);
  }