解析JSON进入地图<字符串,实体>与FlexJSON
我试图解析类似这样的一个JSON结构:解析JSON进入地图<字符串,实体>与FlexJSON
{
"cars": {
"112": {
"make": "Cadillac",
"model": "Eldorado",
"year": "1998"
},
"642": {
"make": "Cadillac",
"model": "Eldorado",
"year": "1990"
},
"9242": {
"make": "Cadillac",
"model": "Eldorado",
"year": "2001"
}
}}
我有makeName,模型中定义的CarEntity类,一年的属性定义和访问通过setter/getters。
我试图反序列化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有两张地图。一个包含'cars'键,另一个包含实际的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实例。
我曾考虑将路径表达式更改为更具表达性,以便您可以将集合中的单个值作为目标,但这会增加评估它们的开销并向后兼容是一项挑战。
只是一个多个呼叫添加到get("cars")
样?
Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
.use("cars.values", Map.class)
.deserialize(json).get("cars");
JSON字符串可能是从类型为Map<String, CarEntity>
你最有可能被咬伤的Java类型擦除可变cars
连载:有问题的JSON库不知道你想要的类型;它看到的所有内容都等同于Map。所以你必须至少指定值类型。希望FlexJSON文档指出如何。你也许可以将HashMap子类化成你自己的类型(MyEntityMap extends HashMap),因为然后类型信息可以从泛型超类型推断出来;并传递MyEntityMap.class会提供大多数JSON库可以使用的类型信息(至少是Jackson和GSON)。
如果这些不起作用,Jackson和GSON库可以轻松处理这个用例;都有方法来指定反序列化的泛型类型。
这实际上没有帮助。显然返回一个不同的地图,但它仍然是字符串的映射,而不是实体对象 – 2010-11-02 15:19:46