java - 如何在 Spring Boot 中获取自定义 JSON 对象响应
问题描述
我需要获取自定义的 JSON 对象,而不是 Spring Boot 中的默认对象。我可以成功获得默认响应,但我需要进行如下自定义。一些对象需要转换为数组,一些字段应该被删除。
实际反应
{
"packId":12,
"packType":"sdf",
"shortCode":"dfsdf",
"packDescription":"fsdfd",
"startDate":null,
"endDate":null,
"validityValue":30,
"validityType":"Second",
"expiryAction":true,
"expiryMsg":64,
"activationSMS":63,
"deactivationAction":true,
"deactivationShortCode":"fhhf",
"deactivationSMS":64,
"deprovisionOnExpiry":true,
"timeBands":[
{
"timeBandId":1,
"start":"10:00",
"end":"22:00",
"timeBand":"10:00-22:00"
},
{
"timeBandId":2,
"start":"12:00",
"end":"20:00",
"timeBand":"12:00-20:00"
}
],
"activationTypes":[
{
"activationTypeId":1,
"name":"SMS"
},
{
"activationTypeId":2,
"name":"WEB"
},
{
"activationTypeId":3,
"name":"Channel"
}
],
"channels":[
{
"channelId":1,
"name":"Hshenid"
},
{
"channelId":2,
"name":"Genisis"
}
],
"users":[
{
},
{
"userId":2,
"name":"Selfcare"
}
]
}
预期响应
{
"packId": 12,
"packType": "sdf",
"shortCode": "dfsdf",
"packDescription": "fsdfd",
"startDate": null,
"endDate": null,
"validityValue": 30,
"validityType": "Second",
"expiryAction": true,
"expiryMsg": 64,
"activationSMS": 63,
"deactivationAction": true,
"deactivationShortCode": "fhhf",
"deactivationSMS": 64,
"deprovisionOnExpiry": true,
"timeBands": [
{
"start": "10:00",
"end": "22:00",
},
{
"start": "12:00",
"end": "20:00",
}
],
"activationTypes": [ "SMS","WEB","Channel"],
"channels": [ "Hshenid","Genisis","Selfcare"],
"users": [ "Selfcare" ]
}
变化
"timeBands": [
{
"start": "10:00",
"end": "22:00",
},
{
"start": "12:00",
"end": "20:00",
}
],
"activationTypes": [ "SMS","WEB","Channel"],
"channels": [ "Hshenid","Genisis","Selfcare"],
"users": [ "Selfcare" ]
服务类实现
@Override
public Optional<Pack> findById(int id) {
return packRepository.findById(id);
}
模型类
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY )
int packId;
String packType;
String shortCode;
String packDescription;
String startDate;
String endDate;
int validityValue;
String validityType;
Boolean expiryAction;
int expiryMsg;
int activationSMS;
Boolean deactivationAction;
String deactivationShortCode;
int deactivationSMS;
Boolean deprovisionOnExpiry;
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "PacksTimeBands",
joinColumns = @JoinColumn(name = "pack_id", referencedColumnName = "packId"),
inverseJoinColumns = @JoinColumn(name = "timeband_id", referencedColumnName = "timeBandId"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"pack_id", "timeband_id"})})
List<TimeBand> timeBands;
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "PacksActivationTypes",
joinColumns = @JoinColumn(name = "pack_id", referencedColumnName = "packId"),
inverseJoinColumns = @JoinColumn(name = "activationtype_id", referencedColumnName = "activationTypeId"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"pack_id", "activationtype_id"})})
List<ActivationType> activationTypes;
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "PacksChannels",
joinColumns = @JoinColumn(name = "pack_id", referencedColumnName = "packId"),
inverseJoinColumns = @JoinColumn(name = "channel_id", referencedColumnName = "channelId"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"pack_id", "channel_id"})})
List<Channel> channels;
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "PacksUsers",
joinColumns = @JoinColumn(name = "pack_id", referencedColumnName = "packId"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "userId"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"pack_id", "user_id"})})
List<User> users;
解决方案
像这样,
Optional<Pack> findById(Long id);
另一种转换您的预期响应的方法。
public Map<String, Objects> generateResponse(Optional<Pack> object){
Map<String, Object> response = new HashMap<>();
if(object.isPresent()){
response.put("packId", object.get().getid());
response.put("packType", object.get().getType());
..... put all the values that you want
//For Objects you want to return in list you can do that this way
ArrayList<?> timeBands = new ArrayList<>();
object.get().timeBands().forEach(timeBand ->{
Map<?> singleBand = new HashMap<>();
singleBand.put("start", timeBand.getStart());
singleBand.put("end", timeBand.getEnd());
//Finally add this Object in list
timeBands.add(singleBand);
});
ArrayList<?> activationType = new ArrayList<>();
object.get().timeBands().forEach(activationTypes ->{
activationType.add(activationTime.get())
});
//Your arraylist to the final response Map
response.put("key you want to keep for timeBands", timeBands);
response.put("key you want to keep for activationType",
activationType);
return response;
}
}
对于列表类型参数
public List<?> generateResponse(List<Pack> object){
ArrayList<?> formattedListPacks = new ArrayList<>();
object.forEach( pack ->{
Map<String, Object> response = new HashMap<>();
response.put("packId", object.get().getid());
response.put("packType", object.get().getType());
..... put all the values that you want
//For Objects you want to return in list you can do that this way
ArrayList<?> timeBands = new ArrayList<>();
object.get().timeBands().forEach(timeBand ->{
Map<?> singleBand = new HashMap<>();
singleBand.put("start", timeBand.getStart());
singleBand.put("end", timeBand.getEnd());
//Finally add this Object in list
timeBands.add(singleBand);
});
ArrayList<?> activationType = new ArrayList<>();
object.get().timeBands().forEach(activationTypes ->{
activationType.add(activationTime.get())
});
//Your arraylist to the final response Map
response.put("key you want to keep for timeBands", timeBands);
response.put("key you want to keep for activationType",
activationType);
formattedListPacks.add(response);
});
return formattedListPacks;
}
推荐阅读
- javascript - Webpack 不会在生产构建中加载 manifest.json 文件
- node.js - NestJS:依赖注入和提供者注册
- asp.net-core - 部署为 docker 容器的 Azure Web 应用程序无限 301 循环
- python - 如何在我的 pandas 数据框列中设置具有不同值的空值
- sql - 设置表值的正确语法是什么
- flutter - dart 是调用函数的重新抛出异常
- java - 关于 SpringBoot Tomcat acceptCount 池
- python - 如何使用破折号在子图中设置轴标签
- c# - 如何根据当前智能卡生成有效的 Pkcs11UriBuilder
- r - 为什么我的 XPath 返回一个空节点集(带有库 xml2)