Как сформировать JSON с помощью библиотеки GSON, чтобы иметь цикл по объектам, спискам? - PullRequest
0 голосов
/ 03 апреля 2019

Я новичок в Java, так как мой опыт работы с JavaScript. Входные данные вводятся через страницу jsp, и их значения подаются для формирования запроса json. У меня есть объекты dto, как показано ниже, используя которые я должен сформировать json, используя библиотеку gson в Java для отправки в качестве запроса почтальону. Теперь я смог сформировать запрос, но точно не знаю, есть ли лучший способ улучшить код, которым я поделился ниже, и хочу знать, как зациклить массив visibilityInfo с другими visibilityType, как в json запрос будет иметь массив из них в запросе.

Пожалуйста, смотрите ниже dto объекты и основной класс, который имеет код

MainClass.java:

  import java.util.ArrayList;
    import java.util.List;
    import com.google.gson.Gson;
    import com.xxx.nsp.constants.Values;
    import com.xxx.nsp.dto.Address;
    import com.xxx.nsp.dto.SendCVConfirmationNotification;
    import com.xxx.nsp.dto.VisibilityInfo;
    import com.xxx.nsp.dto.VisibilityType;
    import com.xxx.nsp.json.NSPNotificationRequest;
    public class MainClass {
        public static void main(String[] args) {        
            NSPNotificationRequest nr = new NSPNotificationRequest();       
            SendCVConfirmationNotification scv = new SendCVConfirmationNotification();      
            Address addr = new Address();
            addr.setAddressType(Values.addressType);
            addr.setAddressLine1(Values.addressLine1);
            addr.setAddressLine2(Values.addressLine2);
            addr.setAddressLine3(Values.addressLine3);
            addr.setPoliticalDivision(Values.politicalDivision);
            addr.setCity(Values.city);
            addr.setState(Values.state);
            addr.setZipcode(Values.zipcode);
            addr.setCountry(Values.country);
            addr.setCountry(Values.country);
            addr.setPhoneNumber(Values.phoneNumber);        
            List<String> accountNumbers = new ArrayList<>();
            accountNumbers.add("1233");
    accountNumbers.add("2234");         
            VisibilityInfo vi = new VisibilityInfo();
            vi.setVisibilityType(VisibilityType.THIRD_PARTY);
            vi.setAccountNumbers(accountNumbers);
            vi.setReceivingAddress(addr);
            List<VisibilityInfo> visibilityInfo = new ArrayList<>();        
            visibilityInfo.add(vi); 
             scv.setEnroleeName(Values.enroleeName);
             scv.setVisibilityInfo(visibilityInfo);
             scv.setCompanyName(Values.companyName);
             scv.setNickName(Values.nickName);
             scv.setHasClaims(Values.hasClaims);
             scv.setHasReturns(Values.hasReturns);
             scv.setCvURL(Values.cvURL);         
            nr.setTransactionId(Values.transactionId);
            nr.setClientId(Values.clientId);
            nr.setDestinationAddress(Values.destinationAddress);
            nr.setSendCVConfirmationNotification(scv);
            nr.setLocale(Values.locale);
            nr.setMediaType(Values.mediaType);
            nr.setPageId(Values.pageId);        
            Gson gsonObj = new Gson();
            String jsonStr = gsonObj.toJson(nr);
            System.out.println(jsonStr);
        }
    } 

SendCVConfirmationNotification.java

import java.io.Serializable;
import java.util.List;
public class SendCVConfirmationNotification implements Serializable {
    private static final long serialVersionUID = -2387905244655074588L;
    private String enroleeName = null;
    private String companyName = null;
    private String nickName = null;
    private List<VisibilityInfo> visibilityInfo = null;
    private boolean hasClaims = false;
    private boolean hasReturns = false;
    private String cvURL = null;
    private String emailId = null;
}

Visibility.java

import java.util.List;
import com.xxx.nsp.dto.Address;
import com.xxx.nsp.dto.VisibilityType;
public class VisibilityInfo {
    private VisibilityType visibilityType = null;   
    private List<String> accountNumbers = null; 
    private Address receivingAddress = null;
}

VisiblityType.java

public enum VisibilityType {
    INBOUND,
    OUTBOUND,
    THIRD_PARTY;
}                    

Address.java

public class Address {  
    private AddressType addressType = null; 
    private String addressLine1 = null;
    private String addressLine2 = null;
    private String addressLine3 = null;
    private String politicalDivision = null;
    private String city = null;
    private String state = null;
    private String zipcode = null;
    private String country = null;
    private String phoneNumber = null;
}

AddressType .java

public enum AddressType
{
    Consignee,
    Shipper,
    Reroute_Address,
}

Ожидаемый результат: Необходимо добавить код для зацикливания VisibilityInfo на основе VisibilityType, как показано в ожидаемом результате

{ 
  "transactionId": "12334567", 
  "clientId": "PPP", 
  "destinationAddress": "xyz@ggg.com", 
  "sendConfirmationNotification": { 
    "enroleeName": "Dev User 992", 
    "visibilityInfo": [ 
      { 
        "visibilityType": "FOURTH_PARTY", 
        "accountNumbers": [ 
          "1233", 
          "6722" 
        ], 
        "receivingAddress": null 
      }, 
      { 
        "visibilityType": "OUTBOUND", 
        "accountNumbers": [ 
          "6152", 
          "1277" 
        ], 
        "receivingAddress": null 
      }, 
      { 
        "visibilityType": "INBOUND", 
        "accountNumbers": null, 
        "receivingAddress": { 
          "addressType": "PPP_Store", 
          "addressLine1": null, 
          "addressLine2": null, 
          "addressLine3": null, 
          "politicalDivision": null, 
          "city": "downtown test", 
          "state": "NY", 
          "zipcode": "7539", 
          "country": "US", 
          "phoneNumber": null 
        } 
      } 
    ], 
    "companyName": "Clent_companyName", 
    "nickName": "DXXX1", 
    "hasClaims": false, 
    "hasReturns": false, 
    "cvURL": "http://www.google.com/test/sampleURL" 
  }, 
  "locale": "en_US", 
  "mediaType": "EMAIL", 
  "pageId": "enroll" 
}

Фактический полученный результат:

{
    "transactionId": "12334567",
    "clientId": "PPP",
    "mediaType": "EMAIL",
    "locale": "en_US",
    "pageId": "enroll",
    "destinationAddress": "xyz@gmail.com",
    "sendCVConfirmationNotification": {
        "enroleeName": "Dev User 992",
        "companyName": "PPP_Clent_companyName",
        "nickName": "DU991",
        "visibilityInfo": [
            {
        "visibilityType": "THIRD_PARTY",
        "accountNumbers": [
            "1233",
            "2234"
        ],
        "receivingAddress": {
            "addressType": "PPP_Store",
            "addressLine1": "addressLine1",
            "addressLine2": "addressLine2",
            "addressLine3": "addressLine3",
            "politicalDivision": "politicalDivision",
            "city": "city",
            "state": "state",
            "zipcode": "zipcode",
            "country": "country",
            "phoneNumber": "phoneNumber"
        }
    }
],
"hasClaims": false,
"hasReturns": false,
"cvURL": "http://www.PPP.com/test/sampleURL"
}    
}

Не могли бы вы помочь мне написать эффективный код и добавить массив объектов на основе VisibilityType к VisibilityInfo в созданный объект json.

1 Ответ

2 голосов
/ 03 апреля 2019

Я бы посоветовал вам создать конструктор для каждого класса, который принимает все необходимые значения.Таким образом, вы можете создавать объекты с гораздо меньшим количеством кода.

MainClass.java:

  import java.util.ArrayList;
  import java.util.List;
  import com.google.gson.Gson;
  import com.xxx.nsp.constants.Values;
  import com.xxx.nsp.dto.Address;
  import com.xxx.nsp.dto.SendCVConfirmationNotification;
  import com.xxx.nsp.dto.VisibilityInfo;
  import com.xxx.nsp.dto.VisibilityType;
  import com.xxx.nsp.json.NSPNotificationRequest;
  public class MainClass {
      public static void main(String[] args) {  

          Address addr = new Address(Values.addressType, Values.addressLine1, 
            Values.addressLine2, Values.addressLine3, Values.politicalDivision,
            Values.city, Values.state, Values.zipcode, null, Values.phoneNumber);

          List<String> accountNumbers = new ArrayList<>();
          accountNumbers.add("1233");
          accountNumbers.add("2234");

          List<VisibilityInfo> visibilityInfo = new ArrayList<>();        
          visibilityInfo.add(new VisibilityInfo(VisibilityType.THIRD_PARTY,
            accountNumbers, addr));  

          SendCVConfirmationNotification scv = new SendCVConfirmationNotification(
            Values.enroleeName, Values.companyName, Values.nickName, visibilityInfo, 
            Values.hasClaims, Values.hasReturns, Values.cvURL, null); 

          NSPNotificationRequest nr = new NSPNotificationRequest(Values.transactionId,
            Values.clientId, Values.destinationAddress, scv, Values.locale,
            Values.mediaType, Values.pageId);

          Gson gsonObj = new Gson();
          String jsonStr = gsonObj.toJson(nr);
          System.out.println(jsonStr);
      }
  } 

добавьте это в SendCVConfirmationNotification.java:

public SendCVConfirmationNotification(String enroleeName, String companyName,
  String nickName, List<VisibilityInfo> visibilityInfo, boolean hasClaims,
  boolean hasReturns, String cvURL, String emailId){
    this.enroleeName = enroleeName;
    this.companyName = companyName;
    this.nickName = nickName;
    this.visibilityInfo = visibilityInfo;
    this.hasClaims = hasClaims;
    this.hasReturns = hasReturns;
    this.cvURL = cvURL;
    this.emailId = emailId;
}

добавить это в VisibilityInfo.java:

public VisibilityInfo(VisibilityType visibilityType, List<String> accountNumbers,
  Address receivingAddress){
    this.visibilityType = visibilityType;
    this.accountNumbers = accountNumbers;
    this.receivingAddress = receivingAddress;
}

добавить это в Address.java:

public Address(AddressType addressType, String addressLine1, String addressLine2,
  String addressLine3, String politicalDivision, String city, String state, String zipcode,
  String country, String phoneNumber){
    this.addressType = addressType;
    this.addressLine1 = addressLine1;
    this.addressLine2 = addressLine2;
    this.addressLine3 = addressLine3;
    this.politicalDivision = politicalDivision;
    this.city = city;
    this.state = state;
    this.zipcode = zipcode;
    this.country = country;
    this.phoneNumber = phoneNumber;
}

добавить это в NSPNotificationRequest:

public NSPNotificationRequest(String transactionId, String clientId,
  String destinationAddress, SendCVConfirmationNotification sendCVConfirmationNotification,
  String locale, String mediaType, String pageId){
    this.transactionId = transactionId;
    this.clientId = clientId;
    this.destinationAddress = destinationAddress;
    this.sendCVConfirmationNotification = sendCVConfirmationNotification;
    this.locale = locale;
    this.mediaType = mediaType;
    this.pageId = pageId;
    //if this class includes any other properties, include them accordingly
}

Редактировать:

Чтобы получить ожидаемый вами результат, вам нужно отредактировать VisibilityType и ваш основной метод:

VisibilityType.java:

public enum VisibilityType {
    INBOUND,
    OUTBOUND,
    FOURTH_PARTY,
    THIRD_PARTY;
}

Main:

 public static void main(String[] args) {  

      List<VisibilityInfo> visibilityInfo = new ArrayList<>(); 

      List<String> accountNumbers = new ArrayList<>();
      accountNumbers.add("1233");
      accountNumbers.add("6722");       
      visibilityInfo.add(new VisibilityInfo(VisibilityType.FOURTH_PARTY,
        accountNumbers, null));

      List<String> accountNumbers = new ArrayList<>();
      accountNumbers.add("6152");
      accountNumbers.add("1277");       
      visibilityInfo.add(new VisibilityInfo(VisibilityType.OUTBOUND,
        accountNumbers, null));

      Address addr = new Address(Values.addressType, null, 
        null, null, null, "downtown test", "NY", "7539", "US", null);    
      visibilityInfo.add(new VisibilityInfo(VisibilityType.OUTBOUND,
        null, addr));

      SendCVConfirmationNotification scv = new SendCVConfirmationNotification(
        Values.enroleeName, Values.companyName, Values.nickName, visibilityInfo, 
        Values.hasClaims, Values.hasReturns, Values.cvURL, null); 

      NSPNotificationRequest nr = new NSPNotificationRequest(Values.transactionId,
        Values.clientId, Values.destinationAddress, scv, Values.locale,
        Values.mediaType, Values.pageId);

      Gson gsonObj = new Gson();
      String jsonStr = gsonObj.toJson(nr);
      System.out.println(jsonStr);
  }

Если я допустил ошибку или неправильно понял вашу проблему, просто скажите мне, и я постараюсь ее исправить.

Несколько советов:

  • Старайтесь публиковать менее общие вопросы и более конкретные вопросы, требующие меньше кода
  • Изучите документы, конструкторы, типы данных и т. Д.
  • Не используйте так многоперечисления.В некоторых случаях они имеют смысл (VisibilityType), а в некоторых - нет (Значения).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...