gpt4 book ai didi

json - 如何配置 Jackson XmlMapper 以使用来自 xml 模式的数据类型

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:22 34 4
gpt4 key购买 nike

我有一个xml消息需要转换成json消息格式。 xml 消息定义了 xml 架构,其中包含元素的类型信息。但是,生成的 json 将所有值作为文本值而不是 xml 模式中提到的 bool 值/数字。我如何指示 XmlMapper() 从 xml 架构中派生类型信息?

XmlMapper xmlMapper = new XmlMapper();
String xmlMsg = getResourceContent("test.xml");
JsonNode node = xmlMapper.readTree(xmlMsg.getBytes());
ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(node);

示例 xml:

<myMessage>
<id>333</id>
<type>Text</type>
<flag>true</flag>
</myMessage>

生成的 json:

{
"id": "333",
"type": "Text",
"flag": "true"
}

预期的 json:

{
"id": 333,
"type": "Text",
"flag": true
}

最佳答案

如果您的 xml 模式很简单,将“true/false”转换为“boolean”并将“number”转换为“long”就足够了。我有一个解决方案。

JsonNode node = xmlMapper.readTree(xmlMsg.getBytes()); 之后,node 的子级是 TextNode 类型。您可以遍历node对象,如果值满足一定条件,将TextNode转换为BooleanNodeLongNode

添加以下方法:

public static JsonNode resolveType(JsonNode jsonNode) {
if (jsonNode instanceof ObjectNode) {
ObjectNode objectNode = (ObjectNode) jsonNode;
Iterator<Entry<String, JsonNode>> fields = objectNode.fields();
while (fields.hasNext()) {
Entry<String, JsonNode> next = fields.next();
next.setValue(resolveType(next.getValue()));
}
} else if (jsonNode instanceof TextNode) {
TextNode textNode = (TextNode) jsonNode;
String value = textNode.textValue();
if ("true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value)) {
jsonNode = BooleanNode.valueOf(Boolean.valueOf(value));
} else if (StringUtils.isNumeric(value)) {
jsonNode = LongNode.valueOf(Long.valueOf(value));
}
}
return jsonNode;
}

然后用这个方法解析JsonNode节点的类型:

JsonNode node = xmlMapper.readTree(xmlMsg.getBytes());
node = resolveType(node); // <--- Add this statement to your code.
ObjectMapper jsonMapper = new ObjectMapper();
//...

输出应该是预期的 json:

{"id":333,"type":"Text","flag":true}

关于json - 如何配置 Jackson XmlMapper 以使用来自 xml 模式的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50689110/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com