Джексон @JsonValue конфликтует с @JsonTypeInfo; Как заставить их работать вместеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Джексон @JsonValue конфликтует с @JsonTypeInfo; Как заставить их работать вместе

Сообщение Anonymous »

Я использую Jackson для сериализации POJO. Этот класс POJO состоит из одних полей и Map других. Я использую пользовательский сериализатор при написании JSON для этого поля MAP. Я хочу избежать получения имени поля Map «others» в моем JSON. Следовательно, я использую @JsonValue в поле Map, но использование @JsonValue конфликтует с @JsonTypeInfo. Мне нужны обе аннотации в моем классе, как я могу этого добиться?
На данный момент я получаю JSON следующим образом: (с @JsonValue и @JsonTypeInfo)
[ "Customer", {
"name" : "Rise Against",
"google:sub" : "MyValue-1",
"age" : "2000"
} ]


Я хотел бы получить JSON как с @JsonValue, так и с @JsonTypeInfo: (Как вы можете видеть остальные > ключ зафиксирован, но его значения добавляются непосредственно в JSON)
{
"isA" : "Customer",
"name" : "Batman",
"google:sub" : "MyValue-1",
"age" : "2008"
}


Я могу получить выходные данные, но мне нужно удалить аннотацию из моего класса:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "isA")

Но если я удалю это, я не получу свойство isA в своем JSON. Я хочу знать, как заставить сериализатор Jackson Json работать как с @JsonTypeInfo, так и с @JsonValue.
Вывод без @JsonTypeInfo но с @JsonValue:
{
"name" : "Rise Against",
"google:sub" : "MyValue-1",
"age" : "2000"
}

Вывод без @JsonValue, но с @JsonTypeInfo
{
"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 others = new HashMap();

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

public Map getOthers() {
return others;
}
}

Ниже приведен мой собственный сериализатор:
public class CustomExtensionsSerializer extends JsonSerializer {

private static final ObjectMapper mapper = new ObjectMapper();

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

public void recusiveSerializer(Map value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
for (Map.Entry 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) extension.getValue()) {
if (dupItems instanceof Map) {
recusiveSerializer((Map) dupItems, gen, serializers);
} else {
gen.writeStringField(extension.getKey(), (String) extension.getValue());
}
}
gen.writeEndObject();
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/677 ... -work-toge
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»