将JSON解析为MAP 使用FlexJSON
-
28-09-2019 - |
题
我正在尝试解析类似于此结构的JSON结构:
{
"cars": {
"112": {
"make": "Cadillac",
"model": "Eldorado",
"year": "1998"
},
"642": {
"make": "Cadillac",
"model": "Eldorado",
"year": "1990"
},
"9242": {
"make": "Cadillac",
"model": "Eldorado",
"year": "2001"
}
}}
我有一个由Makename,Model,年份属性定义和通过Seters/Getters访问的Carentity类。
我试图这样对这个json进行挑选:
Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
.use("cars.values", Map.class)
.deserialize(json);
而且它不起作用:(它确实值得注意,但不适合 Map<String, CarEntity>
而是变成深度地图(就像 Map<String, Map<String, Map<String, String>>>
)
我究竟做错了什么?
解决方案
您的问题是您的JSON有两个地图。一个包含“汽车”钥匙,一个包含实际的保健。不幸的是,您无法在地图中参考单个键,而是此时仅在该键上分配类型。通常,集合的值设置类型是指集合中的所有值。您无需指定包含“汽车”密钥的第一张地图的类型,因为默认情况下它将对其进行测试。
Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
.use("values.values", CarEntity.class )
.deserialize(json).get("cars");
路径“值”是指外部地图的值,然后遍历下一个地图值的所有carentity实例。
我已经考虑将路径表达式更改为更具表现力,使您可以针对集合中的单个值,但这增加了评估它们的开销和向后兼容是一个挑战。
其他提示
您很可能会被Java Type Erasure咬伤:所讨论的JSON库不知道您想要的类型;它所看到的等同于地图。因此,您必须以某种方式指定至少价值键入。希望Flexjson文档指出了如何。
另外,您也许可以将sup-class Hashmap纳入您自己的类型(myentityMap扩展hashmap),因为可以从通用的超级类型推断键入信息;并传递myentityMap.class将提供大多数JSON库可以使用的类型信息(至少杰克逊和Gson)。
如果这些不起作用,Jackson和Gson库可以轻松处理此用例。两者都有指定通用类型的方法。
只需再添加一个电话 get("cars")
像:
Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
.use("cars.values", Map.class)
.deserialize(json).get("cars");
JSON字符串可能是从变量序列化的 cars
键入为 Map<String, CarEntity>