序列化jackson类,因此字段被视为父数组的unamed元素

时间:2015-01-13 18:32:41

标签: java json serialization jackson

我有一个json格式我试图为其创建一个jackson模型对象。 JSON格式是预定义的。部分格式如下:

entities: [
    {
      id: "",
      name: "",
      type: "",
      ...
     }
    {
      id: "",
      name: "",
      type: "",
      ...
     }
    (etc etc)
    ]

这些'实体中的每一个都是'对象可能有不同的字段。例如,我可能有一个用户实体,一个帐户实体和一个提供者实体等.JSON是通用的,但在我的情况下,我建立一个特定的模板,我知道我将创建的每个实体的类型。我可以做这样的事情,它会起作用:

 public class MyTemplate{

     public Entity[] entities;

     public MyTemplate(){
         entities=new Entity[NUM_ENTITIES];
         entities[ENTITY_LOC.User]=new UserEntity();
         entities[ENTITY_LOC.Account]=new AccountEntity();
     }

     public void setUser(UserEntity user){
         entities[ENTITY_LOC.User]=user;
     }
 }

这将正确地进行搜索,并且是一个非常丑陋的模型对象。我更喜欢的是这样的东西:

  Public Class MyTemplate{

      UserEntity user;
      AccountEntity account;

      public MyTemplate(){
          user=new UserEntity();
          account=new AccountEntity();
      }

      public void setUser(UserEntity user){
           this.user=user;
      }
  }

问题是如何使上述对象序列化以符合预期的JSON格式,就好像每个命名字段只不过是一个名为entity的Collection中的通用对象?我知道我可以覆盖序列化解析器,但有一种方法可以简单地使用注释吗?

1 个答案:

答案 0 :(得分:0)

除非您还编写自定义序列化程序,否则无法从第二个代码示例中的MyTemplate结构序列化到您提供的JSON。但是,如果您使用MyTemplate代替List Entities,那么就可以了:

public class MyTemplate {
   List<Entity> entities;

   // accessor, mutator
}

然后在你的问题中将序列化为JSON就好了。您仍然需要编写自定义反序列化器,并且您需要UserAccount模型来扩展Entity,然后放置确定所需的任何字段或逻辑该父类中的实体类型。

繁重的工作将在您的自定义解串器中。

Entity上课:

public class Entity {
   private String id;       
   private String type;
   private String name;

   // accessors, mutators
}

UserEntity上课:

public class UserEntity extends Entity {
   // UserEntity specific fields, logic
}
相关问题