2014-07-04 85 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; 
     } 
    } 
} 

我不知道你是什么意思的“一行反序列化”。如果您寻找更简单的替代方案,唯一能够满足您需求的其他方面是定制解串器,这更加复杂。