com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY,但在第1行第101列路径为BEGIN_OBJECT

问题描述 投票:0回答:3

我正在使用改造来解析API,但它正在给出来自onFailure的响应。我已经尝试了所研究的所有可能的解决方案,但结果仍然相同。我的Api看起来如下:

{
"status": 200,
"data": [
    {
        "club_id": 1,
        "club_name": "XYZ",
        "member_info": {
            "title": "ABC",
            "image": "",
            "position": "",
            "description": null,
            "email": "unknown @gmail.com",
            "landline": "000000",
            "mobile": "00000000",
            "website": "unknown",
            "address": "unknown",
            "blood_group": "unknown blood_group"
        }
     } // edited ( "}" was missing)
  ]
}

我的Model类如下所示:

public class SerialDTO{
@SerializedName("data")
private ArrayList<SerialData> data;
public ArrayList<SerialData> getData() {
    return data;
}
public void setData(ArrayList<SerialData> data) {
    this.data = data;
}
 }

然后我实现了数据成员如下:

public class SerialData implements Parcelable {

@SerializedName("club_id")
String club_id;
@SerializedName("club_name")
String club_name;
@SerializedName("member_info")
private ArrayList<Serial> serial;


public String getClub_id() {
    return club_id;
}

public void setClub_id(String club_id) {
    this.club_id = club_id;
}

public String getClub_name() {
    return club_name;
}

public void setClub_name(String club_name) {
    this.club_name = club_name;
}

public ArrayList<Serial> getSerial() {
    return serial;
}

public void setSerial(ArrayList<Serial> serial) {
    this.serial = serial;
}

protected SerialData(Parcel in) {
    club_id = in.readString();
    club_name = in.readString();
    serial = in.createTypedArrayList(Serial.CREATOR);
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(club_id);
    dest.writeString(club_name);
    dest.writeTypedList(serial);
}

@Override
public int describeContents() {
    return 0;
}

public static final Creator<SerialData> CREATOR = new Creator<SerialData>() {
    @Override
    public SerialData createFromParcel(Parcel in) {
        return new SerialData(in);
    }

    @Override
    public SerialData[] newArray(int size) {
        return new SerialData[size];
    }
};
}

我的会员信息DTO如下:

public class Serial implements Parcelable {

@SerializedName("title")
String title;
@SerializedName("image")
String image;
@SerializedName("position")
String position;
@SerializedName("description")
String description;
@SerializedName("email")
String email;
@SerializedName("landline")
String landline;
@SerializedName("mobile")
String mobile;
@SerializedName("website")
String website;
@SerializedName("address")
String address;
@SerializedName("blood_group")
String bloodGroup;


public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public String getPosition() {
    return position;
}

public void setPosition(String position) {
    this.position = position;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getLandline() {
    return landline;
}

public void setLandline(String landline) {
    this.landline = landline;
}

public String getMobile() {
    return mobile;
}

public void setMobile(String mobile) {
    this.mobile = mobile;
}

public String getWebsite() {
    return website;
}

public void setWebsite(String website) {
    this.website = website;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getBloodGroup() {
    return bloodGroup;
}

public void setBloodGroup(String bloodGroup) {
    this.bloodGroup = bloodGroup;
}

protected Serial(Parcel in) {
    title = in.readString();
    image = in.readString();
    position = in.readString();
    description = in.readString();
    email = in.readString();
    landline = in.readString();
    mobile = in.readString();
    website = in.readString();
    address = in.readString();
    bloodGroup = in.readString();
}

public static final Creator<Serial> CREATOR = new Creator<Serial>() {
    @Override
    public Serial createFromParcel(Parcel in) {
        return new Serial(in);
    }

    @Override
    public Serial[] newArray(int size) {
        return new Serial[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(title);
    parcel.writeString(image);
    parcel.writeString(position);
    parcel.writeString(description);
    parcel.writeString(email);
    parcel.writeString(landline);
    parcel.writeString(mobile);
    parcel.writeString(website);
    parcel.writeString(address);
    parcel.writeString(bloodGroup);
}
}

我的Api界面:

public interface MembersApi {
@GET("api/family_tree")
Call<SerialDTO> getMyJSON();
}

我已经实现了API的解析,如下所示:

 private void fetchMember() {

    MembersApi service = new RetrofitApiClient(getApplicationContext()).createService(MembersApi.class);

    Call<SerialDTO> call = service.getMyJSON();
    call.enqueue(new Callback<SerialDTO>() {
        @Override
        public void onResponse(Call<SerialDTO> call, Response<SerialDTO> response) {

            if (response.isSuccessful()) {

           SerialDTO RealResponse=new SerialDTO();
          ArrayList<SerialData> data=new ArrayList<>();
                RealResponse = response.body();

                data = RealResponse.getData();


                initGridView();

            }
        }

        @Override
        public void onFailure(Call<SerialDTO> call, Throwable t) {
            Log.d("TAG", "Failure" + t);
        }
    });

}
android exception retrofit2
3个回答
1
投票

使用This site

对于任何与json相关的事情。此外,您发布的json也缺少“}”括号。

通常,您的datamodel类应该是这样的:

public class Datum {

    @SerializedName("club_id")
    @Expose
    private Integer clubId;
    @SerializedName("club_name")
    @Expose
    private String clubName;
    @SerializedName("member_info")
    @Expose
    private MemberInfo memberInfo;

    public Integer getClubId() {
    return clubId;
    }

    public void setClubId(Integer clubId) {
    this.clubId = clubId;
    }

    public String getClubName() {
    return clubName;
    }

    public void setClubName(String clubName) {
    this.clubName = clubName;
    }

    public MemberInfo getMemberInfo() {
    return memberInfo;
    }

    public void setMemberInfo(MemberInfo memberInfo) {
    this.memberInfo = memberInfo;
    }

    }

2.

public class Example {

    @SerializedName("status")
    @Expose
    private Integer status;
    @SerializedName("data")
    @Expose
    private List<Datum> data = null;

    public Integer getStatus() {
    return status;
    }

    public void setStatus(Integer status) {
    this.status = status;
    }

    public List<Datum> getData() {
    return data;
    }

    public void setData(List<Datum> data) {
    this.data = data;
    }

    }

3.

public class MemberInfo {

    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("image")
    @Expose
    private String image;
    @SerializedName("position")
    @Expose
    private String position;
    @SerializedName("description")
    @Expose
    private Object description;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("landline")
    @Expose
    private String landline;
    @SerializedName("mobile")
    @Expose
    private String mobile;
    @SerializedName("website")
    @Expose
    private String website;
    @SerializedName("address")
    @Expose
    private String address;
    @SerializedName("blood_group")
    @Expose
    private String bloodGroup;

    public String getTitle() {
    return title;
    }

    public void setTitle(String title) {
    this.title = title;
    }

    public String getImage() {
    return image;
    }

    public void setImage(String image) {
    this.image = image;
    }

    public String getPosition() {
    return position;
    }

    public void setPosition(String position) {
    this.position = position;
    }

    public Object getDescription() {
    return description;
    }

    public void setDescription(Object description) {
    this.description = description;
    }

    public String getEmail() {
    return email;
    }

    public void setEmail(String email) {
    this.email = email;
    }

    public String getLandline() {
    return landline;
    }

    public void setLandline(String landline) {
    this.landline = landline;
    }

    public String getMobile() {
    return mobile;
    }

    public void setMobile(String mobile) {
    this.mobile = mobile;
    }

    public String getWebsite() {
    return website;
    }

    public void setWebsite(String website) {
    this.website = website;
    }

    public String getAddress() {
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }

    public String getBloodGroup() {
    return bloodGroup;
    }

    public void setBloodGroup(String bloodGroup) {
    this.bloodGroup = bloodGroup;
    }

    }

1
投票

你没有错过这个护腕吗?

{
"status": 200,
"data": [
    {
        "club_id": 1,
        "club_name": "XYZ",
        "member_info": {
            "title": "ABC",
            "image": "",
            "position": "",
            "description": null,
            "email": "unknown @gmail.com",
            "landline": "000000",
            "mobile": "00000000",
            "website": "unknown",
            "address": "unknown",
            "blood_group": "unknown blood_group"
        }
  }//here
  ]
}

0
投票

我解决了我是以数组的形式获取数据。我刚刚更改了SerialData类中的代码,如下所示:

以前我这样做过

@SerializedName("member_info")
private ArrayList<Serial> serial;

并通过这样解决:

@SerializedName("member_info")
private Serial serial;
© www.soinside.com 2019 - 2024. All rights reserved.