有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;

共 (1) 个答案

  1. # 1 楼答案

    就像这样

     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;
    }