2012-12-01 257 views
1

我有一個錯誤的傑克遜反序列化一個json文件到一個poco的問題。這是我的代碼:反序列化映射傑克遜

 JsonParser jp = new JsonFactory().createJsonParser(new File(pathFile)); 
     ObjectMapper objectMapper = new ObjectMapper(); 

     MappingIterator<AnimalBean> animalsss = objectMapper.readValues(jp, AnimalBean.class); 
     while (animalsss.hasNext()) 
     { 
      AnimalBean abba = animalsss.next(); 
      System.out.println(abba.getNom()); 
     } 

我的POCO命名AnimalBean:

public class AnimalBean 
{ 
private String id; 
private String nom; 
private String nom_scientifique; 
private String classe; 
private String ordre; 
private String famille; 
private String details_zone;  
private String poids; 
private String duree_gestation; 
private String nb_gestation; 
private String longevite; 
private String description; 
private String images; 
    ... + all getter/setter 

} 我的JSON文件:

{ 
"zoo": { 
    "animaux": { 
     "animal": [{ 
      "id": 1, 
      "nom": "test", 
      "nom_scientifique": "test2", 
      "classe": 1, 
      "ordre": 3, 
      "famille": 4, 
      "details_zone": "Zones", 
      "poids": "80", 
      "duree_gestation": "11", 
      "nb_gestation": "1", 
      "longevite": "25 ans", 
      "description": "texte de description" 
       }] 
      } 
    } 

}

當我執行我的代碼,我有以下錯誤:無法識別的字段「動物園」(類AnimalBean),未標記爲可忽略。我知道問題是我的json文件不是直接由動物開始,但我不能改變它,因爲它不是我的。我已經嘗試將objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);但它改變了一切。

有人可以幫助我嗎?

回答

0

這是完全未經測試的代碼,因爲我無法準確地複製您的情況/代碼。基本上它試圖獲得作爲字符串的值,並做一些解包,然後創建另一個JsonParser。

ObjectMapper objectMapper = new ObjectMapper(); 
JsonParser jp = new JsonFactory().createJsonParser(new File(pathFile)); 
String json = jp.getText(); 
JsonNode node = objectMapper.readTree(json).get("Animal"); 
JsonParser jp2 = new JsonFactory().createJsonParser(node.getTextValue()); 

MappingIterator<AnimalBean> animalsss = objectMapper.readValues(jp2, AnimalBean.class); 
while (animalsss.hasNext()) 
{ 
    AnimalBean abba = animalsss.next(); 
    System.out.println(abba.getNom()); 
} 
+0

上面的代碼是有點冗長:線2和3是不必要的 - 只使用'objectMapper.readTree(新文件(pathFile) )'。此外,'JsonNode.asParser()'可用於簡化其餘代碼。但基本的想法是健全的。 – StaxMan

1

爲什麼不僅僅使用幾個包裝類來匹配JSON呢?

喜歡:

public class Wrapper { 
    public Zoo zoo; 
} 
public class Zoo { 
    public Animals animaux; 
} 
public class Animals { 
    public Animal[] animal; 
} 

,然後用結合:

Wrapper w = mapper.readValue(json, Wrapper.class); 
for (Animal animal : w.zoo.animaux.animal) { 
    // process! 
}