Java Jackson@JsonValue与@JsonTypeInfo冲突;如何让他们一起工作

Java Jackson@JsonValue与@JsonTypeInfo冲突;如何让他们一起工作,java,json,serialization,jackson,jackson2,Java,Json,Serialization,Jackson,Jackson2,我正在使用Jackson对POJO进行序列化。这个POJO类由一些字段和一个映射其他字段组成。我在为这个MAP字段编写JSON时使用了自定义序列化程序。我希望避免在我的JSON中获得映射字段名“others”。因此,我在Map字段上使用@JsonValue,但使用@JsonValue与@JsonTypeInfo>冲突。在我的课堂上我需要两个注解,我如何才能做到这一点 到目前为止,我得到了如下JSON(@JsonValue和@JsonTypeInfo) 我希望通过@JsonValue和@JsonT

我正在使用
Jackson
POJO
进行序列化。这个
POJO
类由一些字段和一个
映射其他字段组成。我在为这个
MAP
字段编写
JSON
时使用了
自定义序列化程序。我希望避免在我的
JSON
中获得
映射字段名“others”。因此,我在
Map
字段上使用
@JsonValue
,但使用
@JsonValue
@JsonTypeInfo>冲突。在我的课堂上我需要两个注解,我如何才能做到这一点

到目前为止,我得到了如下
JSON
@JsonValue
@JsonTypeInfo

我希望通过
@JsonValue
@JsonTypeInfo
获得如下
JSON
:(如您所见,
其他
键已提交,但其值直接添加到JSON中)

我可以获得输出,但需要从类中删除注释:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "isA")
但是如果我删除它,那么我将无法在JSON中获得
isA
属性。我想知道如何使
Jackson-Json序列化程序
@JsonTypeInfo
@JsonValue
一起工作

不带
@JsonTypeInfo
但带
@JsonValue
的输出:

{
  "name" : "Rise Against",
  "google:sub" : "MyValue-1",
  "age" : "2000"
}
不带
@JsonValue
但带有
@JsonTypeInfo

[ "Customer", {
  "name" : "Rise Against",
  "google:sub" : "MyValue-1",
  "age" : "2000"
} ]

{
  "isA" : "Customer",
  "name" : "",
  "age" : "",
  "others" : {
    "name" : "Rise Against",
    "google:sub" : "MyValue-1",
    "age" : "2000"
  }
}
以下是我的
客户
类Pojo:

@XmlRootElement(name = "Customer")
@XmlType(name = "Customer", propOrder = {"name", "age", "others"})
@XmlAccessorType(XmlAccessType.FIELD)
@NoArgsConstructor
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor
@JsonIgnoreType
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, visible = true, property = "isA")
public class Customer {

  @XmlElement(name = "name", required = true)
  private String name;

  @XmlElement(name = "age", required = true)
  private String age;

  @JsonSerialize(using = CustomExtensionsSerializer.class)
  @XmlJavaTypeAdapter(TestAdapter.class)
  @XmlPath(".")
  @JsonValue
  private Map<String, Object> others = new HashMap<>();

  @JsonAnySetter
  public void setOthers(String key, Object value) {
    others.put(key, value);
  }

  public Map<String, Object> getOthers() {
    return others;
  }
}
@XmlRootElement(name=“Customer”)
@XmlType(name=“Customer”,proporter={“name”,“age”,“others”})
@XmlAccessorType(XmlAccessType.FIELD)
@诺尔格构装师
@吸气剂
@塞特
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor
@JsonIgnoreType
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=As.PROPERTY,visible=true,PROPERTY=“isA”)
公共类客户{
@xmlement(name=“name”,required=true)
私有字符串名称;
@xmlement(name=“age”,required=true)
私弦时代;
@JsonSerialize(使用=CustomExtensionsSerializer.class)
@XmlJavaTypeAdapter(TestAdapter.class)
@XmlPath(“.”)
@JsonValue
private-Map-others=new-HashMap();
@JSONANYSETER
public void setOthers(字符串键、对象值){
其他。放置(键、值);
}
公共地图getOthers(){
归还他人;
}
}
以下是我的自定义序列化程序:

public class CustomExtensionsSerializer extends JsonSerializer<Map<String, Object>> {

  private static final ObjectMapper mapper = new ObjectMapper();

  @Override
  public void serialize(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeStartObject();
    recusiveSerializer(value, gen, serializers);
    gen.writeEndObject();
  }

  public void recusiveSerializer(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    for (Map.Entry<String, Object> extension : value.entrySet()) {
      if (extension.getValue() instanceof Map) {
        //If instance is MAP then call the recursive method
        recusiveSerializer((Map) extension.getValue(), gen, serializers);
      } else if (extension.getValue() instanceof String) {
        //If instance is String directly add it to the JSON
        gen.writeStringField(extension.getKey(), (String) extension.getValue());
      } else if (extension.getValue() instanceof ArrayList) {
        //If instance if ArrayList then loop over it and add it to the JSON after calling recursive method
        gen.writeFieldName(extension.getKey());
        gen.writeStartObject();
        for (Object dupItems : (ArrayList<String>) extension.getValue()) {
          if (dupItems instanceof Map) {
            recusiveSerializer((Map) dupItems, gen, serializers);
          } else {
            gen.writeStringField(extension.getKey(), (String) extension.getValue());
          }
        }
        gen.writeEndObject();
      }
    }
  }
}
公共类CustomExtensionSerializer扩展JsonSerializer{
私有静态最终ObjectMapper mapper=新ObjectMapper();
@凌驾
public void serialize(映射值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
gen.writeStartObject();
递归序列化器(值、生成、序列化器);
writeEndObject将军();
}
public void recusiveSerializer(映射值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
for(Map.Entry扩展名:value.entrySet()){
if(扩展名.getValue()实例映射){
//如果实例是MAP,则调用递归方法
递归序列化程序((Map)扩展名.getValue(),gen,序列化程序);
}else if(扩展名.getValue()instanceof String){
//如果实例是字符串,则直接将其添加到JSON
gen.writeStringField(extension.getKey(),(String)extension.getValue());
}else if(扩展名.getValue()实例为ArrayList){
//If实例If ArrayList然后在调用递归方法后对其进行循环并将其添加到JSON中
gen.writeFieldName(扩展名.getKey());
gen.writeStartObject();
对于(对象dupItems:(ArrayList)扩展名.getValue()){
if(映射的dupItems实例){
递归序列化器((映射)重复项、生成项、序列化器);
}否则{
gen.writeStringField(extension.getKey(),(String)extension.getValue());
}
}
writeEndObject将军();
}
}
}
}

尝试将
@JsonTypeInfo.include
设置为
JsonTypeInfo.As.EXISTING\u属性

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.EXISTING_属性,visible=true,PROPERTY=“isA”)

您好,感谢您抽出时间回复。我确实试过这个。添加此选项将生成与问题中提供的第一个JSON相同的JSON。它添加了
数组
作为我的JSON的包装,而且,值完全被弄乱了,像这样:
[“Customer”,{“google:main”:{“google:sub”:“MyValue-1”},“name”:“BATMAN”,“age”:“2008”}]
public class CustomExtensionsSerializer extends JsonSerializer<Map<String, Object>> {

  private static final ObjectMapper mapper = new ObjectMapper();

  @Override
  public void serialize(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeStartObject();
    recusiveSerializer(value, gen, serializers);
    gen.writeEndObject();
  }

  public void recusiveSerializer(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    for (Map.Entry<String, Object> extension : value.entrySet()) {
      if (extension.getValue() instanceof Map) {
        //If instance is MAP then call the recursive method
        recusiveSerializer((Map) extension.getValue(), gen, serializers);
      } else if (extension.getValue() instanceof String) {
        //If instance is String directly add it to the JSON
        gen.writeStringField(extension.getKey(), (String) extension.getValue());
      } else if (extension.getValue() instanceof ArrayList) {
        //If instance if ArrayList then loop over it and add it to the JSON after calling recursive method
        gen.writeFieldName(extension.getKey());
        gen.writeStartObject();
        for (Object dupItems : (ArrayList<String>) extension.getValue()) {
          if (dupItems instanceof Map) {
            recusiveSerializer((Map) dupItems, gen, serializers);
          } else {
            gen.writeStringField(extension.getKey(), (String) extension.getValue());
          }
        }
        gen.writeEndObject();
      }
    }
  }
}