序列化 jackson class 因此字段被视为父数组的未命名元素

Serialize jackson class so fields are treated as unamed elements of parent array

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

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

每个 'entity' 对象可能有不同的字段。例如,我可能有一个用户实体、一个帐户实体和一个提供者实体等。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;
     }
 }

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

  Public Class MyTemplate{

      UserEntity user;
      AccountEntity account;

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

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

问题是如何使上述对象序列化以符合预期的 JSON 格式,就好像每个命名字段只不过是命名实体集合中的通用对象一样?我知道我可以覆盖序列化解析器,但是有没有办法只用注释来做到这一点?

无法将第二个代码示例中的 MyTemplate 结构序列化为您提供的 JSON 结构,除非您还编写自定义序列化程序。但是,如果您对 MyTemplate 使用 EntitiesList 没有问题:

public class MyTemplate {
   List<Entity> entities;

   // accessor, mutator
}

然后这将序列化到您问题中的 JSON 就好了。您仍然需要编写自定义反序列化器,并且需要 UserAccount 模型来扩展 Entity,然后放置确定该父实体中的实体类型 class.

繁重的工作将在您的自定义反序列化器中完成。

Entity class:

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

   // accessors, mutators
}

UserEntity class:

public class UserEntity extends Entity {
   // UserEntity specific fields, logic
}