2014-07-04 34 views
1

我有一個JSON文件,該文件是這樣的:傑克遜註釋,便於JSON反序列化

{ 
    "root": [ 
       { 
       "id": "abc1", 
       "x": "x1", 
       "y": "y1" 
       }, 
       { 
       "id": "abc2", 
       "x": "x2", 
       "y": "y2" 
       }, 
     ... 
      ] 
} 

我想與傑克遜反序列化這從一個類中,看起來像這樣的對象:

Class A { 
    Map<String, String> x; 
    Map<String, String> y; 
} 

在最後我想要的A內的地圖對象看起來像:

X = {(ABC1,X1),(ABC2,X2)}, Y = {(ABC1,Y1),(ABC2,Y2 )}

有沒有一種方法可以用Jackson對這個類進行註釋,以便我可以在一行中執行這種反序列化?我無法找到一種方法來做到這一點,而不必改變A級的設計。

+2

不,那個json不會簡單地映射到那個java類。 –

+0

看起來像List 給我。你有沒有定義一個映射器? – Hannes

+0

@Hannes我該怎麼做? – user3804009

回答

1

理想情況下,X和Y會被分成兩個帶有ID的對象。如果完全可能重構您的JSON或Java對象以更好地滿足您的需求,那麼您將遵循最佳實踐並且您的代碼將更容易遵循 - 我明白這並不總是一種選擇。

你可以做的一件事是創建一個自定義類,它模仿數組內部對象的結構。然後你可以註釋一個構造函數並傳入這個自定義對象的列表。這樣的事情:

public class A { 
    private Map<String, String> x; 
    private Map<String, String> y; 

    @JsonCreator 
    public A(@JsonProperty("root") List<Entity> entities) { 
     for (Entity entity : entities) { 
      x.put(entity.getId, entity.getX()); 
      y.put(entity.getId, entity.getY()); 
     } 
    } 

    public static class Entity { 
     private String id; 
     private String x; 
     private String y; 

     public String getId() { 
      return id; 
     } 

     public String setId(String id) { 
      this.id = id; 
     } 

     public String getX() { 
      return x; 
     } 

     public String setX(String x) { 
      this.x = x; 
     } 

     public String getY() { 
      return y; 
     } 

     public String setY(String y) { 
      this.y = y; 
     } 
    } 
} 

我不知道你是什麼意思的「一行反序列化」。如果您尋找更簡單的替代方案,唯一能夠滿足您需求的其他方面是定製解串器,這更加複雜。