Ожидаемый BEGIN_ARRAY, но был STRING в этом коде - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть проблема, это в моем андроиде, получая Json в почтальоне:

{
    "syskey": "base64:5i/Sy3ujzpOhqTowu838H2gx2Uk4+LR4tLkK5eOZgfk=",
    "createDate": "",
    "updateDate": "",
    "data": {
        "market_mobile_banner": [
            {
                "id": 1,
                "banner_txt": "banner1",
                "banner_price": "12.99",
                "banner_file": "https://webqr.saltcloudserver.com/storage/banner/PumdmssQTRKpAfyD7a6ai5NTCJJd7fFpOmCqKmPH.png"
            },
            {
                "id": 2,
                "banner_txt": "banner2",
                "banner_price": "33.95",
                "banner_file": "https://webqr.saltcloudserver.com/storage/banner/X9sxhmREMRbyYV1poo2UnHUJKF9Bt6eQqcBL2LVn.jpeg"
            },
            {
                "id": 3,
                "banner_txt": "Banner3",
                "banner_price": "5.66",
                "banner_file": "https://webqr.saltcloudserver.com/storage/banner/4dGmwqiFB0V4qGfX1ZkEVFrILZUekvE0pPsjfCID.jpeg"
            }
        ],
        "whatsnew": [
            {
                "id": 1,
                "new_txt": "new1",
                "new_file": "https://webqr.saltcloudserver.com/storage/new/Z1DB604SqG43tc3XJbJXxvqwES3H4BofMimnMVqP.jpeg"
            },
            {
                "id": 2,
                "new_txt": "new2",
                "new_file": "https://webqr.saltcloudserver.com/storage/new/FW39O5VLPvF4aBXd1UQwWWP3m6NLwx7IMSnYvHXk.jpeg"
            },
            {
                "id": 3,
                "new_txt": "new3",
                "new_file": "https://webqr.saltcloudserver.com/storage/new/Srh5nCQekGLH9IPbmAkqwFV6pMou7yCXbkpWGp2l.jpeg"
            }
        ]
    }
}

GetHomeResponse.kt

data class GetHomeResponse(
    val syskey: String? = null,
    val createDate: String? = null,
    val updateDate: String? = null,
    val data: HomeData? = null)

HomeData.kt

data class HomeData(
     @SerializedName("market_mobile_banner")
     val marketMobileBanner: List<MarketMobileBannerItem?=null,
    val whatsnew: List<WhatsnewItem>?=null)

MarketMobileBannerItem.kt

data class MarketMobileBannerItem(
     val id: Int? = null,
     @SerializedName("banner_txt")
     val bannerTxt: String? = null,
     @SerializedName("banner_price")
     val bannerPrice: String? = null,
     @SerializedName("banner_file")
     val bannerFile: String? = null)

WhatsNewItem.kt

data class WhatsnewItem(
     val id: Int? = null,
     @SerializedName("new_txt")
     @Expose
     val newTxt: String? = null,
     @SerializedName("new_file")
     @Expose
     val newFile: String? = null)

WebQr.kt

interface WebQrApi {
  @GET("home/{outLetId}")
  fun getHomeData(@Path("outLetId") 
  outLetId:Int):Observable<GetHomeResponse>}

Когда я вызываю его из своего кода Android с модификацией, у меня возникает ошибка com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 118 path $.data.whatsnew . Мой формат неверен или данные сервера неверны?Это показывает ошибку сбоя. Как я могу исправить?Мой друг сказал, что это неправильно в формате Json при добавлении атрибутов в коллекцию. Но он возвращается в виде строки.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Ваша базовая модель будет выглядеть примерно так

public class MyPojo {

    @SerializedName("syskey")
    @Expose
    public String syskey;
    @SerializedName("createDate")
    @Expose
    public String createDate;
    @SerializedName("updateDate")
    @Expose
    public String updateDate;
    @SerializedName("data")
    @Expose
    public Data data;

}

И, пожалуйста, однажды убедитесь, что вы использовали эту модель, как показано ниже в интерфейсе API

@FormUrlEncoded
@POST("api_url")
Call<MyPojo> callGetData(@FieldMap Map<String, String> method);

Я надеюсь, что после вышесказанного убедитесь, что ваша ошибка будет решена

@ Ptut Я получил что-то упущенное в опубликованном коде модели, как только проверил это

data class HomeData(
@SerializedName("market_mobile_banner")
val marketMobileBanner: List<MarketMobileBannerItem?=null,
val whatsnew: List<WhatsnewItem>?=null)

Вы забыличтобы закрыть список тегов> marketMobileBanner , чтобы вы получили новый код, подобный приведенному ниже

data class HomeData(
@SerializedName("market_mobile_banner")
val marketMobileBanner: List<MarketMobileBannerItem>?=null,
val whatsnew: List<WhatsnewItem>?=null)
0 голосов
/ 08 февраля 2019

Ожидается BEGIN_ARRAY, но в строке 1 столбца 118 путь STRING

Ошибка выше означает, что вы используете String вместо Array Json.

Решение: - Попробуйте получить доступ к этой переменной с помощью JsonArray.

Используйте эти POJO в своей модернизации ...

Data.class

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Data {

@SerializedName("market_mobile_banner")
@Expose
private List<MarketMobileBanner> marketMobileBanner = null;
@SerializedName("whatsnew")
@Expose
private List<Whatsnew> whatsnew = null;

public List<MarketMobileBanner> getMarketMobileBanner() {
return marketMobileBanner;
}

public void setMarketMobileBanner(List<MarketMobileBanner> marketMobileBanner) {
this.marketMobileBanner = marketMobileBanner;
}

public List<Whatsnew> getWhatsnew() {
return whatsnew;
}

public void setWhatsnew(List<Whatsnew> whatsnew) {
this.whatsnew = whatsnew;
}

}

MarketMobileBanner.class

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class MarketMobileBanner {

@SerializedName("id")
@Expose
private Integer id;
@SerializedName("banner_txt")
@Expose
private String bannerTxt;
@SerializedName("banner_price")
@Expose
private String bannerPrice;
@SerializedName("banner_file")
@Expose
private String bannerFile;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getBannerTxt() {
return bannerTxt;
}

public void setBannerTxt(String bannerTxt) {
this.bannerTxt = bannerTxt;
}

public String getBannerPrice() {
return bannerPrice;
}

public void setBannerPrice(String bannerPrice) {
this.bannerPrice = bannerPrice;
}

public String getBannerFile() {
return bannerFile;
}

public void setBannerFile(String bannerFile) {
this.bannerFile = bannerFile;
}

}

Result.class

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Result {

@SerializedName("syskey")
@Expose
private String syskey;
@SerializedName("createDate")
@Expose
private String createDate;
@SerializedName("updateDate")
@Expose
private String updateDate;
@SerializedName("data")
@Expose
private Data data;

public String getSyskey() {
return syskey;
}

public void setSyskey(String syskey) {
this.syskey = syskey;
}

public String getCreateDate() {
return createDate;
}

public void setCreateDate(String createDate) {
this.createDate = createDate;
}

public String getUpdateDate() {
return updateDate;
}

public void setUpdateDate(String updateDate) {
this.updateDate = updateDate;
}

public Data getData() {
return data;
}

public void setData(Data data) {
this.data = data;
}

}

Whatsnew.class

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Whatsnew {

@SerializedName("id")
@Expose
private Integer id;
@SerializedName("new_txt")
@Expose
private String newTxt;
@SerializedName("new_file")
@Expose
private String newFile;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getNewTxt() {
return newTxt;
}

public void setNewTxt(String newTxt) {
this.newTxt = newTxt;
}

public String getNewFile() {
return newFile;
}

public void setNewFile(String newFile) {
this.newFile = newFile;
}

}

Используйте Result.class для вашей сигнатуры метода модифицированного интерфейса.

Примечание: - Это может быть bcoz вашего класса POJO, где вы инициализировали переменнуюкак String вместо List<YourObject>.

Попробуйте преобразовать свой JSON в POJO, используя эту LINK .

...