1

我正在尝试解析与此类似的 JSON 结构:

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

我有一个 CarEntity 类,它定义了 makeName、model、year 属性,并且可以通过 setter/getter 访问。

我正在尝试像这样反序列化这个 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>>>

我究竟做错了什么?

4

3 回答 3

2

你的问题是你的 json 有两个地图。一个包含“汽车”键,另一个包含实际的 CarEntity。不幸的是,此时您不能引用 Map 中的单个键并仅在该键上分配类型。通常为集合的值设置类型是指集合中的所有值。您不需要为包含“cars”键的第一个 Map 指定类型,因为默认情况下它将反序列化它。

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

路径“values.values”指的是外部地图的值,然后遍历下一个地图值都是 CarEntity 实例。

我考虑过将路径表达式更改为更具表现力,允许您针对集合中的单个值,但这增加了评估它们的开销并且向后兼容是一个挑战。

于 2010-11-02T18:07:58.647 回答
1

您很可能被 Java Type Erasure 所困扰:有问题的 JSON 库不知道您想要的类型;它所看到的一切都相当于 Map。因此,您必须以某种方式至少指定值类型。希望 FlexJSON 文档指出如何。

或者,您可以将 HashMap 子类化为您自己的类型(MyEntityMap 扩展 HashMap),因为可以从通用超类型推断类型信息;并传递 MyEntityMap.class 将提供大多数 JSON 库可以使用的类型信息(至少是杰克逊和 GSON)。

如果这些不起作用,Jackson 和 GSON 库可以轻松处理此用例;两者都有方法来指定反序列化的泛型类型。

于 2010-11-02T16:31:22.567 回答
0

只需再添加一个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>

于 2010-11-02T14:02:54.693 回答