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