示例獲取請求:http://localhost:3000/contact/1
我得到了什么:
{
"id": 1,
"firstname": "First Name",
"lastname": "Last Name",
"emailaddresses": [
{
"emailaddress": "[email protected]"
},
{
"emailaddress": "[email protected]"
}
]
}
我想要的是:
{
"id": 1,
"firstname": "First Name",
"lastname": "Last Name",
"emailaddresses": ["[email protected]","[email protected]"]
}
下面的代碼:
人事部
public class PersonDto {
private Long id;
private String firstname;
private String lastname;
private List<EmailAddressDto> emailaddresses;
//getters setters
}
電子郵件地址Dto
public class EmailAddressDto {
private String emailaddress;
//getters and setters
}
服務類
public PersonDto getPerson(Long personId) { //this is the method inside the class
Optional<PersonEntity> p = peopleRepository.findById(personId);
var dto = modelMapper.map(p.get(), PersonDto.class);
return dto;
}
我還有一個PersonEntity類一對多映射到一個EmailAddressesEntity類。
我對 spring/java 真的很陌生 - 我不知道如何獲得我想要的 JSON 結構。
uj5u.com熱心網友回復:
您可以只注釋withemailaddress欄位并保持原樣。EmailAddressDto@JsonValue
public class EmailAddressDto {
@JsonValue
private String emailaddress;
//getters and setters
}
使用上述示例的輸出:
PersonDto personDto = new PersonDto();
personDto.setId(1L);
personDto.setFirstname("John");
personDto.setLastname("Doe");
personDto.setEmailaddresses(Arrays.asList(new EmailAddressDto("[email protected]"), new EmailAddressDto("[email protected]")));
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(personDto);
System.out.println(json);
是:
{"id":1,"firstname":"John","lastname":"Doe","emailaddresses":["[email protected]","[email protected]"]}
uj5u.com熱心網友回復:
我建議您使用字串串列而不是 EmailAddressDto 的串列。
以下原因:
- 由于您的 Dto 中只有一個屬性,因此您可以輕松地直接使用字串串列來代替。
- 您將獲得第二個 JSON-Layout 作為對 GET-Request 的回應。
當使用變體編號 1(使用 EmailAddressDto 串列)時,您將獲得具有多個物件的 JSON 回應,用于不同的電子郵件地址。否則,當您使用變體編號 2(帶有字串串列)時,您將獲得一個 JSON-Response,它看起來像您想要的那樣。
所以不要忘記改變你的物體。
public class PersonDto {
private Long id;
private String firstname;
private String lastname;
private List<String> emailAddresses;
//getters setters
}
uj5u.com熱心網友回復:
如果你可以改變你的PersonDto那將是最簡單和最干凈的方法。
public class PersonDto {
private Long id;
private String firstname;
private String lastname;
private List<String> emailaddresses;
//getters setters
}
在映射物體時,您需要映射EmailAddressesEntity到String表示它的物體( emailaddress)。
如果這是不可能的,您將需要一個自定義轉換器,EmailAddressDto如下所示:
public class ListEmailAddressDtoConverter extends StdConverter<List<EmailAddressDto>, List<String>> {
@Override
public List<String> convert(List<EmailAddressDto> emailAddresses) {
return emailAddresses.stream().map(EmailAddressDto::getEmailaddress).collect(Collectors.toList());
}
}
然后你需要告訴杰克遜使用它:
public class PersonDto {
private Long id;
private String firstname;
private String lastname;
@JsonSerialize(converter = ListEmailAddressDtoConverter.class)
private List<EmailAddressDto> emailaddresses;
//getters setters
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314180.html
上一篇:如何構建一個不與資料庫互動的springboot專案
下一篇:Spring訪問日志按天輪換
