Сделать поле класса необязательным для преобразования в json

#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 разными полезными нагрузками, упомянутыми мной. В любом случае спасибо. »