2010-11-02 57 views
1

我試圖解析類似這樣的一個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>>>

我在做什麼錯

回答

2

你是問題是你的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實例。

我曾考慮將路徑表達式更改爲更具表達性,以便您可以將集合中的單個值作爲目標,但這會增加評估它們的開銷並向後兼容是一項挑戰。

0

只是一個多個呼叫添加到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

1

你最有可能被咬傷的Java類型擦除可變cars連載:有問題的JSON庫不知道你想要的類型;它看到的所有內容都等同於Map。所以你必須至少指定值類型。希望FlexJSON文檔指出如何。你也許可以將HashMap子類化成你自己的類型(MyEntityMap extends HashMap),因爲然後類型信息可以從泛型超類型推斷出來;並傳遞MyEntityMap.class會提供大多數JSON庫可以使用的類型信息(至少是Jackson和GSON)。

如果這些不起作用,Jackson和GSON庫可以輕鬆處理這個用例;都有方法來指定反序列化的泛型類型。

相關問題