#java #json #class #jackson #field
#java #json #класс #джексон #поле
Вопрос:
У меня есть приложение для весенней загрузки. Я предоставил API, который использует тело JSON. Полезная нагрузка выглядит следующим образом:
{ userName: Karan,
userId: 123,
age: 29,
addtionalInfo: {accountType: A}
}
Мой метод имеет соответствующий класс для обработки этой полезной нагрузки:
class PayloadDto {
private String userName;
private String userId;
private int age;
private Map<String, String> addtionalInfo;
public PayloadDto(){}
//getters
//setters
}
Это работает нормально.
Недавно нам пришлось внести улучшения в наш api. Теперь мне нужно улучшить класс, чтобы он мог принимать 2 типа полезных нагрузок. один из упомянутых выше должен работать нормально, как есть, и расширенный класс также должен работать нормально для новой полезной нагрузки ниже:
{ userName: Karan,
userId: 123,
age: 29,
addtionalInfo: {accountType: A}
occupationDetails : { designation: developer, email: abc@xyz.com, companyName: Alfa}
}
Можете ли вы помочь, как должен выглядеть мой класс, чтобы он нормально работал для обеих этих 2 полезных нагрузок json?
Я думал о написании такого класса:
class PayloadDto {
private String userName;
private String userId;
private int age;
private Map<String, String> addtionalInfo;
private Map<String, String> occupationDetails;
public PayloadDto(){}
//getters
//setters
}
Но это будет нормально работать только со 2-м json и завершится неудачей для 1-й полезной нагрузки json.
Ответ №1:
Я собираюсь предположить, что ваш JSON действительно действителен и выглядит следующим образом:
{
"userName": "Karan",
"userId": 123,
"age": 29,
"addtionalInfo": {
"accountType": "A"
},
"occupationDetails": {
"designation": "developer",
"email": "abc@xyz.com",
"companyName": "Alfa"
}
}
Тогда ваш класс будет:
@JsonInclude(Include.NON_EMPTY)
class PayloadDto {
private String userName;
private String userId;
private int age;
// new data types
private AdditionalInfo additionalInfo;
private OccupationDetails occupationDetails;
public PayloadDto(){}
//getters
//setters
}
Таким образом, в основном вы просто создаете новые классы и определяете их соответствующие члены, точно так же, как вы сделали с «базовым» классом.
@JsonInclude(Include.NON_EMPTY)
сообщает Джексону игнорировать отсутствующие (ваши «необязательные») свойства.
Комментарии:
1. Спасибо за исправление моего json. Я просто хочу, чтобы мой единый метод API работал для 2 разных типов полезных нагрузок, как упоминалось выше (2 json выше: у одного есть «occupationDetails», а у другого нет). Итак, если какая-либо из приведенных выше полезных данных json передается в вызове api, мой метод должен работать нормально. Мой метод api выглядит следующим образом: @PutMapping(значение = «/v1, потребляет = тип среды. APPLICATION_JSON_VALUE) добавление общедоступной строки(@RequestBody PayloadDataDTO полезная нагрузка) { . //Сделайте что-нибудь с полученной полезной нагрузкой }
2. Я только что добавил @JsonIgnoreProperties (ignoreUnknown = true) в свой класс PayloadDataDTO. К моему удивлению, на самом деле мой класс PayloadDataDto способен обрабатывать обе полезные нагрузки. Я не уверен, но теперь я думаю, что даже без каких-либо аннотаций это будет работать нормально. Итак, определенно, мне не нужно использовать: @JsonInclude(Включить. НЕПУСТОЕ)
3. итак, в чем именно ваша проблема, работает ли ваш код сейчас? Используя описанный мной подход, вы должны быть в состоянии обрабатывать обе полезные нагрузки.
additionalInfo
иoccupationDetails
будут равны нулю, если они отсутствуют в полезной нагрузке.4. Эй, я просто не знал, что все поля класса обязательны = false по умолчанию. Следовательно, простое добавление нового поля «private OccupationDetails occupationDetails;» в классе работает для меня. Я знаю, как использовать NonNull, непустой и т.д. Дальше. Я просто хотел, чтобы класс не прерывался для обоих вызовов с 2 разными полезными нагрузками, упомянутыми мной. В любом случае спасибо. »