java - 使用 Jackson 将 XML 转换为 Map,Key 应为小写
问题描述
我正在尝试将 XML 字符串转换为 Map,下面的代码转换得很好,但我需要映射键应该统一的方式(小写或大写)。
public static void main(String[] args) throws Exception {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);
String xml = "<Find Status=\"Success\"><Result><Provider><lastUpdated>1545391251168</lastUpdated></Provider></Result></Find>";
System.out.println(xmlMapper.readValue(xml.getBytes(), Map.class));
}
实际输出为:
{状态=成功,结果={提供者={lastUpdated=1545391251168}}}
预期输出为:
{状态=成功,结果={提供者={lastupdated=1545391251168}}}
依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.8</version>
</dependency>
解决方案
可能有更简单的方法来做到这一点,但如果没有其他方法,你总是可以创建一个JsonDeserializer
. 无论如何,我认为这PropertyNamingStrategy
与您如何将 bean 字段映射到 xml/json 与Map
键无关,但我可能错了。请参阅以下内容:
public class LowerKeyDeserializer extends JsonDeserializer<Map<String, Object>> {
@Override
public Map<String, Object> deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
Map<String, Object> map = new HashMap<>();
JsonToken jsonToken;
String name = null;
while (null != (jsonToken = p.nextToken())) {
switch (jsonToken) {
case FIELD_NAME:
name = p.getText().toLowerCase(); // "magic" here
break;
case VALUE_STRING:
map.put(name, p.getText()); // value as it is
break;
case START_OBJECT: // and this will be a "sub"map, recursive call
map.put(name, deserialize(p, ctxt));
break;
default:
;
}
}
return map;
}
}
您需要在上面使用 注册JacksonXmlModule
,见下文:
@Test
public void test() throws JsonParseException, JsonMappingException, IOException {
JacksonXmlModule xmlModule = new JacksonXmlModule();
xmlModule.addDeserializer(Map.class, new LowerKeyDeserializer());
XmlMapper xmlMapper = new XmlMapper(xmlModule);
String xml = "<Find Status=\"Success\"><Result><Provider><lastUpdated>1545391251168</lastUpdated></Provider></Result></Find>";
Map<?, ?> map = xmlMapper.readValue(xml.getBytes(), Map.class);
System.out.println(map);
}
这应该打印:
{结果={提供者={lastupdated=1545391251168}},状态=成功}
推荐阅读
- firebase - 获取父 uid 数据
- node.js - ffmpeg 安装在现有的 Node.js docker 镜像中
- node.js - 无法以角度创建新项目
- xamarin.forms - 如何使我的选择器选项呈现为框而不是微调器?
- python-2.7 - 导入caffe的问题
- c# - 如何替换文本中的字符颜色?
- ios - iOS 操作扩展中的后台任务
- javascript - 如何使用 javascript 切换 MathJax 渲染与代码?
- c++ - 在带括号的循环中的 return 语句的情况下,错误可能会显示到非 void 函数的末尾,但在没有括号的循环的情况下则不会
- php - 索引页面上的 URL 重写