json - 如何为字符串和数组做一般值类型?
问题描述
我需要从远程服务解析一些 JSON 数据。
请求和/或响应文档如下所示。
{
"some": "...",
"someOther": [
"...",
"..."
],
"youDontKnow": "...",
"mayBeThis": [
"what"
]
}
如您所见,我认为只有值string
或array
值。
现在,我不想映射每个字段,而是想知道是否有任何方法可以使用以下映射。
Map<String, Object> map; // each value may be string or array
这样我就可以按键获取并按需将值转换为 aString
或 a String[]
(或)。List<String>
我怎样才能做到这一点?
解决方案
使用时,DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
您可以将所有值视为List
-s。
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, List.class);
Map<String, List> map = mapper.readValue(jsonFile, mapType);
System.out.println(map);
印刷:
{some=[...], someOther=[..., ...], youDontKnow=[...], mayBeThis=[what]}
没有它,您可以使用创建适当类型的默认行为:
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(jsonFile, Map.class);
System.out.println(map);
印刷:
{some=..., someOther=[..., ...], youDontKnow=..., mayBeThis=[what]}
第二种解决方案需要您检查它是否是List
os String
。第一个解决方案允许您将每个值视为List
并且您有很多简洁的解决方案。第三个选项是创建POJO
with List
,String
属性并Jackson
自动匹配和解析给定JSON
的。
推荐阅读
- php - 如何使用 Google Charts 和 MySQL 在不同表具有相同小时(日期时间)时显示来自不同表的数据?
- math - 在笛卡尔坐标系中查找坐标
- movesense - 我的 movesense 有 1.1.0 版。我可以用 Showcaseapp-1.9.6.apk 将固件刷到 1.9 而没有任何问题吗?
- asp.net-core - 如何防止 cookie 身份验证重定向到登录
- primefaces - 隐藏 p:tree 中的树节点而不删除它们
- python - Python OpenCV实时模糊并保存到输出
- excel - 区域小数分隔符和 ADODB 为 MS-Access 准备的 SQL 请求
- batch-file - 在新行中批量合并两个 .txt 文件,每个文件交替一个
- java - 在java项目中获取txt文件时出现问题
- arcgis - 使用 Arcgis JS 从地理数据库中绘制形状