我正在尝试解析类似于此结构的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>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top