Как исправить частичный разбор JSON? - PullRequest
0 голосов
/ 21 января 2019

Я использую Retrofit 2 для вызовов API и GSON в качестве конвертера в моем проекте Android. Преобразовал json в POJO и следовал обычным методам, которые также используются в 50+ API в том же проекте.

Но, это конкретный сценарий, некоторые элементы анализируются и присваиваются переменной, а другие нет.

как разрешить этот частичный разбор?

Здесь вы можете увидеть разницу в отладке на Android и почтальоне

enter image description here

Product.class

public class ProductLookup {
    @SerializedName("atsQty")
    @Expose
    private String atsQty;
    @SerializedName("combID")
    @Expose
    private String combID;
    @SerializedName("defaultPickLock")
    @Expose
    private String defaultPickLock;
    @SerializedName("lookupProductPickingLocation")
    @Expose
    private ArrayList<ProductPickingLocation> productPickingLocations = new ArrayList<>();
    @SerializedName("productID")
    @Expose
    private String productID;
    @SerializedName("productName")
    @Expose
    private String productName;
    @SerializedName("totalQty")
    @Expose
    private String totalQty;
    @SerializedName("unitName")
    @Expose
    private String unitName;
    @SerializedName("upc")
    @Expose
    private String upc;
    @SerializedName("vendorName")
    @Expose
    private String vendorName;
    @SerializedName("whName")
    @Expose
    private String whName;

//getter setters 
}

Json response

 {
            "atsQty": 133,
            "combID": 0,
            "defaultPickLock": "FA1",
            "lookupProductPickingLocation": [
                {
                    "availQty": 22,
                    "isdefault": true,
                    "lookupProductBatch": [],
                    "lookupProductLotSerial": [],
                    "pickLockID": 26,
                    "pickingLocationName": "FA1",
                    "prodPickLockID": 77,
                    "totalQty": 27
                },
                {
                    "availQty": 100,
                    "isdefault": false,
                    "lookupProductBatch": [],
                    "lookupProductLotSerial": [],
                    "pickLockID": 27,
                    "pickingLocationName": "FA2",
                    "prodPickLockID": 121,
                    "totalQty": 100
                },
                {
                    "availQty": 6,
                    "isdefault": false,
                    "lookupProductBatch": [],
                    "lookupProductLotSerial": [],
                    "pickLockID": 28,
                    "pickingLocationName": "FB1",
                    "prodPickLockID": 131,
                    "totalQty": 6
                }
            ],
            "productID": 1065,
            "productName": "Arm & Hammer Baking Soda",
            "totalQty": 133,
            "unitName": "",
            "upc": "5454546",
            "vendorName": "Vandelay Industries",
            "whName": "Warehouse 2"
        }

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Ваши atsQty combID и totalQty переменные выглядят как целочисленные, и вы использовали строковый тип в вашем POJO, поэтому. Попробуйте приведенный ниже код, пожалуйста, надеюсь, это поможет.

Если вы не знакомы, то Вот ресурс , где вы можете получить помощь в создании pojo на основе вашего JSON.

ProductLookup.class

public class ProductLookup {

   @SerializedName("atsQty")
   @Expose
   public Integer atsQty;
   @SerializedName("combID")
   @Expose
   public Integer combID;
   @SerializedName("defaultPickLock")
   @Expose
   public String defaultPickLock;
   @SerializedName("lookupProductPickingLocation")
   @Expose
   public List<LookupProductPickingLocation> lookupProductPickingLocation = new ArrayList();
   @SerializedName("productID")
   @Expose
   public Integer productID;
   @SerializedName("productName")
   @Expose
   public String productName;
   @SerializedName("totalQty")
   @Expose
   public Integer totalQty;
   @SerializedName("unitName")
   @Expose
   public String unitName;
   @SerializedName("upc")
   @Expose
   public String upc;
   @SerializedName("vendorName")
   @Expose
   public String vendorName;
   @SerializedName("whName")
   @Expose
   public String whName;

  //getters and setters
}

LookupProductPickingLocation.class

public class LookupProductPickingLocation {

     @SerializedName("availQty")
     @Expose
     public Integer availQty;
     @SerializedName("isdefault")
     @Expose
     public Boolean isdefault;
     @SerializedName("lookupProductBatch")
     @Expose
     public List<Object> lookupProductBatch = null;
     @SerializedName("lookupProductLotSerial")
     @Expose
     public List<Object> lookupProductLotSerial = null;
     @SerializedName("pickLockID")
     @Expose
     public Integer pickLockID;
     @SerializedName("pickingLocationName")
     @Expose
     public String pickingLocationName;
     @SerializedName("prodPickLockID")
     @Expose
     public Integer prodPickLockID;
     @SerializedName("totalQty")
     @Expose
     public Integer totalQty;

//getters and setters.
}
0 голосов
/ 21 января 2019

Первая ошибка, которую я увидел здесь

@SerializedName("lookupProductPickingLocation")
@Expose
private ArrayList<ProductPickingLocation> productPickingLocations = new ArrayList<>();

Когда вы используете @Expose, вы фактически используете productPickingLocations.Вы можете проверить здесь для @ Expose vs @ SerializedName

Используйте это

@SerializedName("lookupProductPickingLocation")
private ArrayList<ProductPickingLocation> productPickingLocations = new ArrayList<>();

или

@Expose
private ArrayList<ProductPickingLocation> lookupProductPickingLocation = new ArrayList<>();

Во-вторых,

@SerializedName("atsQty")
@Expose
private String atsQty;

вы определили как String, но в Postman это ясно видно как целое число.Я думаю, что это проблема.Вам нужно проверить все ваши определения.

...