【问题标题】:Is it possible to use variable as @JsonRootName?是否可以将变量用作@JsonRootName?
【发布时间】:2016-07-10 14:41:26
【问题描述】:

我有一个类似的 spring 项目和类,并希望生成以根名称为类型的 json。这是一个例子:

public class Person {
  private String type; //worker
  private String name; //Dennis
  private String surname; //Ritchie
}

结果应该是:

{"worker" : {
   "name" : "Dennis" ,
   "surname" : "Ritchie"
   }
}

我可以使用 @JsonRootName 之类的 Json 标签来实现吗,还是应该为 worker 编写一个 Class 并扩展 Person 类(有 3 种不同的类型)?

【问题讨论】:

    标签: java json spring serialization


    【解决方案1】:

    当您需要将对象序列化为不同形式的 JSON 时,您可以实现自定义 Serializer:

    public class PersonSerializer extends JsonSerializer<Person> {
        @Override
        public void serialize(Person person, JsonGenerator jgen, SerializerProvider provider) 
            throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            jgen.writeFieldName(person.getType());
            jgen.writeStartObject();
            jgen.writeFieldName("name", person.getName());
            jgen.writeFieldName("surname", person.getSurname());
            jgen.writeEndObject();
            jgen.writeEndObject();
        }
    }
    

    之后,就可以在类上注册序列化器了:

    @JsonSerialize(using = PersonSerializer.class)
    public class Person {
        private String type; 
        private String name; 
        private String surname; 
    }
    

    【讨论】:

    • 有什么方法可以避免为 POJO 中的每个字段调用writeFieldName?仅仅为了添加一个额外的字段而必须复制所有内容似乎很愚蠢(更不用说如果 POJO 发生更改,必须记住在两个地方更新字段)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多