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);
}
我有一个 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);
}