Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将变量用作@JsonRootName?_Java_Json_Spring_Serialization - Fatal编程技术网

Java 是否可以将变量用作@JsonRootName?

Java 是否可以将变量用作@JsonRootName?,java,json,spring,serialization,Java,Json,Spring,Serialization,我有一个spring项目和类似的类,希望生成根名称为类型的json。以下是一个例子: public class Person { private String type; //worker private String name; //Dennis private String surname; //Ritchie } 结果应该是: {"worker" : { "name" : "Dennis" , "surname" : "Ritchie" } } 我可以使用

我有一个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和extend Person类编写一个类(有3种不同的类型)?

当需要将对象序列化为具有不同形式的Json时,可以实现自定义序列化程序:

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();
    }
}

有没有办法避免对POJO中的每个字段调用
writeFieldName
?仅仅为了添加一个额外的字段而复制所有内容似乎很愚蠢(更不用说如果POJO发生变化,必须记住在两个地方更新字段)。
@JsonSerialize(using = PersonSerializer.class)
public class Person {
    private String type; 
    private String name; 
    private String surname; 
}