解析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>

+0

这实际上没有帮助。显然返回一个不同的地图,但它仍然是字符串的映射,而不是实体对象 – 2010-11-02 15:19:46

你最有可能被咬伤的Java类型擦除可变cars连载:有问题的JSON库不知道你想要的类型;它看到的所有内容都等同于Map。所以你必须至少指定值类型。希望FlexJSON文档指出如何。你也许可以将HashMap子类化成你自己的类型(MyEntityMap extends HashMap),因为然后类型信息可以从泛型超类型推断出来;并传递MyEntityMap.class会提供大多数JSON库可以使用的类型信息(至少是Jackson和GSON)。

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