簡體   English   中英

將JSON解析為Map <String, Entity> 與FlexJSON

[英]Parsing JSON into Map<String, Entity> with FlexJSON

我正在嘗試解析類似於此的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,year屬性的CarEntity類,可以通過setters / getters訪問。

我正在嘗試反序列化此JSON,如下所示:

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

它不起作用:(它確實將其反序列化,但不是反序列化為Map<String, CarEntity>而是深層Map(類似Map<String, Map<String, Map<String, String>>> ))

我究竟做錯了什么?

您的問題是您的json有兩個地圖。 一個包含“ cars”鍵,另一個包含實際的CarEntity。 不幸的是,目前您不能在Map中引用單個鍵,而只能在該鍵上分配類型。 通常,為集合的值設置類型是指集合中的所有值。 您無需為第一個包含“ cars”鍵的地圖指定類型,因為默認情況下它將反序列化。

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

路徑“ values.values”是指外部Map的值,然后遍歷下一個Map的值都是所有CarEntity實例。

我考慮過將路徑表達式更改為更具表達性,從而允許您將集合中的單個值作為目標,但這會增加評估它們的開銷,並且向后兼容是一個挑戰。

您很可能被Java Type Erasure所咬傷:有問題的JSON庫不知道您想要的類型。 它所看到的一切都等同於Map。 因此,您必須至少以某種方式指定值類型。 希望FlexJSON文檔指出如何做。

另外,您也可以將HashMap子類化為您自己的類型(MyEntityMap擴展了HashMap),因為這樣可以從泛型超級類型推斷出類型信息。 並傳遞MyEntityMap.class將提供大多數JSON庫可以使用的類型信息(至少是Jackson和GSON)。

如果這些方法不起作用,Jackson和GSON庫可以輕松處理此用例。 兩者都有指定反序列化通用類型的方法。

只需再添加一個對get("cars")調用即可,例如:

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

jSon字符串可能是從類型為Map<String, CarEntity>的可變cars序列化的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM