Я использую 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
Джексон @JsonValue конфликтует с @JsonTypeInfo; Как заставить их работать вместе ⇐ JAVA
Программисты JAVA общаются здесь
1735942760
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();
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/67799938/jackson-jsonvalue-is-conflicting-with-jsontypeinfo-how-to-make-them-work-toge[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия