簡體   English   中英

使用 Retrofit & Gson 解析 JSON 數組響應

[英]Parse JSON array response using Retrofit & Gson

這是我來自 Web 服務的 JSONArray 響應:

[
  {
    "sponsors": [
      {
        "leg_id": "NYL000067",
        "type": "primary",
        "name": "AUBRY"
      },
      {
        "leg_id": "NYL000171",
        "type": "cosponsor",
        "name": "PERRY"
      },
      {
        "leg_id": "NYL000066",
        "type": "cosponsor",
        "name": "ARROYO"
      },
      {
        "leg_id": "NYL000223",
        "type": "cosponsor",
        "name": "BARRETT"
      },
      {
        "leg_id": "NYL000312",
        "type": "cosponsor",
        "name": "STECK"
      },
      {
        "leg_id": "NYL000180",
        "type": "cosponsor",
        "name": "RIVERA"
      },
      {
        "leg_id": "NYL000114",
        "type": "cosponsor",
        "name": "GOTTFRIED"
      },
      {
        "leg_id": "NYL000091",
        "type": "cosponsor",
        "name": "COOK"
      },
      {
        "leg_id": "NYL000126",
        "type": "cosponsor",
        "name": "JAFFEE"
      },
      {
        "leg_id": "NYL000327",
        "type": "cosponsor",
        "name": "DAVILA"
      },
      {
        "leg_id": "NYL000144",
        "type": "cosponsor",
        "name": "LUPARDO"
      },
      {
        "leg_id": null,
        "type": "cosponsor",
        "name": "SEPULVEDA",
        "committee_id": null
      },
      {
        "leg_id": "NYL000290",
        "type": "cosponsor",
        "name": "MOSLEY"
      },
      {
        "leg_id": "NYL000167",
        "type": "cosponsor",
        "name": "ORTIZ"
      },
      {
        "leg_id": "NYL000170",
        "type": "cosponsor",
        "name": "PEOPLES-STOKES"
      },
      {
        "leg_id": "NYL000221",
        "type": "cosponsor",
        "name": "SKARTADOS"
      },
      {
        "leg_id": "NYL000216",
        "type": "cosponsor",
        "name": "QUART"
      },
      {
        "leg_id": "NYL000208",
        "type": "cosponsor",
        "name": "WEPRIN"
      },
      {
        "leg_id": "NYL000186",
        "type": "cosponsor",
        "name": "ROSENTHAL"
      },
      {
        "leg_id": "NYL000139",
        "type": "cosponsor",
        "name": "LIFTON"
      },
      {
        "leg_id": "NYL000064",
        "type": "cosponsor",
        "name": "ABINANTI"
      },
      {
        "leg_id": "NYL000173",
        "type": "cosponsor",
        "name": "PRETLOW"
      },
      {
        "leg_id": "NYL000339",
        "type": "cosponsor",
        "name": "BICHOTTE"
      },
      {
        "leg_id": null,
        "type": "cosponsor",
        "name": "BARRON",
        "committee_id": null
      },
      {
        "leg_id": "NYL000341",
        "type": "cosponsor",
        "name": "WALKER"
      },
      {
        "leg_id": "NYL000355",
        "type": "cosponsor",
        "name": "BLAKE"
      },
      {
        "leg_id": "NYL000185",
        "type": "cosponsor",
        "name": "RODRIGUEZ"
      },
      {
        "leg_id": "NYL000259",
        "type": "cosponsor",
        "name": "FAHY"
      },
      {
        "leg_id": "NYL000203",
        "type": "cosponsor",
        "name": "TITONE"
      },
      {
        "leg_id": "NYL000286",
        "type": "cosponsor",
        "name": "MCDONALD"
      },
      {
        "leg_id": "NYL000081",
        "type": "cosponsor",
        "name": "CAHILL"
      },
      {
        "leg_id": "NYL000421",
        "type": "cosponsor",
        "name": "HARRIS"
      },
      {
        "leg_id": "NYL000338",
        "type": "cosponsor",
        "name": "JOYNER"
      },
      {
        "leg_id": "NYL000448",
        "type": "cosponsor",
        "name": "JENNE"
      },
      {
        "leg_id": "NYL000070",
        "type": "cosponsor",
        "name": "BENEDETTO"
      },
      {
        "leg_id": "NYL000310",
        "type": "cosponsor",
        "name": "SOLAGES"
      },
      {
        "leg_id": "NYL000357",
        "type": "cosponsor",
        "name": "RICHARDSON"
      },
      {
        "leg_id": "NYL000324",
        "type": "cosponsor",
        "name": "PICHARDO"
      },
      {
        "leg_id": "NYL000423",
        "type": "cosponsor",
        "name": "HYNDMAN"
      },
      {
        "leg_id": "NYL000313",
        "type": "cosponsor",
        "name": "STIRPE"
      },
      {
        "leg_id": "NYL000131",
        "type": "cosponsor",
        "name": "KAVANAGH"
      },
      {
        "leg_id": "NYL000204",
        "type": "cosponsor",
        "name": "TITUS"
      },
      {
        "leg_id": "NYL000275",
        "type": "cosponsor",
        "name": "KIM"
      },
      {
        "leg_id": "NYL000195",
        "type": "cosponsor",
        "name": "SIMOTAS"
      },
      {
        "leg_id": "NYL000293",
        "type": "cosponsor",
        "name": "OTIS"
      },
      {
        "leg_id": "NYL000220",
        "type": "cosponsor",
        "name": "MAYER"
      },
      {
        "leg_id": "NYL000344",
        "type": "cosponsor",
        "name": "JEAN-PIERRE"
      }
    ],
    "id": "NYB00099404"
  },
  {
    "sponsors": [
      {
        "leg_id": "NJL000113",
        "type": "primary",
        "name": "Vainieri Huttle, Valerie"
      }
    ],
    "id": "NJB00038817"
  },
  {
    "sponsors": [
      {
        "leg_id": "NYL000208",
        "type": "primary",
        "name": "WEPRIN"
      }
    ],
    "id": "NYB00066288"
  },
  {
    "sponsors": [
      {
        "leg_id": "NJL000083",
        "type": "primary",
        "name": "Jasey, Mila M."
      },
      {
        "leg_id": "NJL000086",
        "type": "primary",
        "name": "Caputo, Ralph R."
      },
      {
        "leg_id": "NJL000046",
        "type": "primary",
        "name": "Watson Coleman, Bonnie"
      },
      {
        "leg_id": "NJL000177",
        "type": "primary",
        "name": "Pintor Marin, Eliana"
      },
      {
        "leg_id": "NJL000164",
        "type": "primary",
        "name": "Sumter, Shavonda E."
      },
      {
        "leg_id": "NJL000104",
        "type": "primary",
        "name": "Oliver, Sheila Y."
      },
      {
        "leg_id": "NJL000095",
        "type": "primary",
        "name": "Mainor, Charles"
      },
      {
        "leg_id": "NJL000165",
        "type": "primary",
        "name": "Wimberly, Benjie E."
      },
      {
        "leg_id": "NJL000016",
        "type": "cosponsor",
        "name": "Fuentes, Angel"
      },
      {
        "leg_id": "NJL000085",
        "type": "cosponsor",
        "name": "Tucker, Cleopatra G."
      },
      {
        "leg_id": "NJL000067",
        "type": "cosponsor",
        "name": "Stender, Linda"
      },
      {
        "leg_id": "NJL000114",
        "type": "cosponsor",
        "name": "Johnson, Gordon M."
      },
      {
        "leg_id": "NJL000082",
        "type": "cosponsor",
        "name": "McKeon, John F."
      },
      {
        "leg_id": "NJL000129",
        "type": "cosponsor",
        "name": "Singleton, Troy"
      }
    ],
    "id": "NJB00030216"
  },
  {
    "sponsors": [
      {
        "leg_id": "NYL000088",
        "official_type": "SPONSOR",
        "type": "primary",
        "name": "Clark"
      },
      {
        "leg_id": "NYL000171",
        "official_type": "COSPNSR",
        "type": "cosponsor",
        "name": "Perry"
      }
    ],
    "id": "NYB00035573"
  },
  {
    "sponsors": [
      {
        "leg_id": "NJL000111",
        "type": "primary",
        "name": "Schaer, Gary S."
      },
      {
        "leg_id": "NJL000018",
        "type": "primary",
        "name": "Lampitt, Pamela R."
      },
      {
        "leg_id": "NJL000105",
        "type": "primary",
        "name": "Giblin, Thomas P."
      },
      {
        "leg_id": "NJL000171",
        "type": "primary",
        "name": "Mosquera, Gabriela M."
      },
      {
        "leg_id": "NJL000011",
        "type": "cosponsor",
        "name": "Moriarty, Paul D."
      },
      {
        "leg_id": "NJL000165",
        "type": "cosponsor",
        "name": "Wimberly, Benjie E."
      },
      {
        "leg_id": "NJL000010",
        "type": "cosponsor",
        "name": "Madden, Fred H."
      },
      {
        "leg_id": "NJL000007",
        "type": "cosponsor",
        "name": "Sweeney, Stephen M."
      },
      {
        "leg_id": "NJL000039",
        "type": "cosponsor",
        "name": "Thompson, Samuel D."
      },
      {
        "leg_id": "NJL000112",
        "type": "cosponsor",
        "name": "Weinberg, Loretta"
      },
      {
        "leg_id": "NJL000087",
        "type": "cosponsor",
        "name": "Ruiz, M. Teresa"
      }
    ],
    "id": "NJB00021785"
  },
  {
    "sponsors": [
      {
        "leg_id": "NYL000138",
        "official_type": "SPONSOR",
        "type": "primary",
        "name": "Lentol"
      }
    ],
    "id": "NYB00010409"
  },
  {
    "sponsors": [
      {
        "leg_id": "NJL000028",
        "type": "primary",
        "name": "Gove, DiAnne C."
      },
      {
        "leg_id": "NJL000027",
        "type": "primary",
        "name": "Rumpf, Brian E."
      },
      {
        "leg_id": "NJL000099",
        "type": "cosponsor",
        "name": "Prieto, Vincent"
      }
    ],
    "id": "NJB00002928"
  },
  {
    "sponsors": [
      {
        "leg_id": "NJL000094",
        "type": "primary",
        "name": "Chiappone, Anthony"
      },
      {
        "leg_id": "NJL000034",
        "type": "cosponsor",
        "name": "Angelini, Mary Pat"
      }
    ],
    "id": "NJB00010952"
  }
]

這是 ApiInterface.java

public interface ApiInterface {

    @GET("bills/")
    Call<SponsorsResult> getListOfSponsors(@Query("bill_id") String billId , @Query("session") String session, @Query("fields") String field);

}

這是方法和響應的調用:

ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);

Call<SponsorsResult> call = apiService.getListOfSponsors(AppConstants.ASSEMBLY_BILL_ID,AppConstants.SESSION,AppConstants.FIELD);
call.enqueue(new Callback<SponsorsResult>() {
    @Override
    public void onResponse(Call<SponsorsResult> call, Response<SponsorsResult> response) {

        Log.d(TAG,"Number :" + response.raw());
        List<Sponsor> sponsors = response.body().getSponsors();
        Log.d(TAG,"Number of sponsors :" + sponsors.size());
    }

    @Override
    public void onFailure(Call<SponsorsResult> call, Throwable t) {
        t.printStackTrace();
    }
});

截至目前,它失敗了,這里是 logcat 輸出:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

它無法執行 response 。 指導我解析此響應。

請嘗試使用這個

    @FormUrlEncoded
    @POST("api/sponsors")
    Call<List<SponsorsResult>> getStatesAndDistrict(
            @Field("xyz") String field1
    );



   Call <List<SponsorsResult>> call = service.getSponsorsValue();

    call.enqueue(new Callback<List<SponsorsResult>>() {
        @Override
        public void onResponse(Call<List<SponsorsResult>> call, Response<List<SponsorsResult>> response) {

            List<SponsorsResult> rs = response.body();

        }

        @Override
        public void onFailure(Call<List<SponsorsResult>> call, Throwable t) {

        }
    });



 class SponsorsResult {

    @SerializedName("sponsors")
    private List<SponsorsValue> sponsors;

    public List<SponsorsValue> getSponsors() {
        return sponsors;
    }
}

class SponsorsValue{
    @SerializedName("leg_id")
    @Expose
    private String legId;
    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("name")
    @Expose
    private String name;

    public String getLegId() {
        return legId;
    }

    public void setLegId(String legId) {
        this.legId = legId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

如果您遇到任何問題,請告訴我。

您可以使用此鏈接自動從 json 響應創建 POJO 類 -> jsonschema2pojo

您需要做的就是將 JSON 響應粘貼到給定的編輯框中。

  1. 選擇目標語言為 JAVA,
  2. 源類型為 JSON
  3. 注釋樣式為 Gson
  4. 並檢查使用基本類型,包括 getter 和 setter,允許其他屬性

簡短的回答是。 如果您的 JSON 響應以 JSON 數組開頭,請​​使用列表:

@GET("bills/")
Call<List<YourResponse>> getListOfSponsors(....);

VS 錯誤:

@GET("bills/")
Call<YourResponse> getListOfSponsors(....);

在您的模型包中創建以下類:

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

public class SponsorModel {

 @SerializedName("sponsors")
@Expose
private List<Sponsor> sponsors = null;
@SerializedName("id")
@Expose
private String id;

public List<Sponsor> getSponsors() {
    return sponsors;
}

public void setSponsors(List<Sponsor> sponsors) {
    this.sponsors = sponsors;
}

public String getId() {
    return id;
}

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

}

-------------------------------------Sponsor.java------------ -----------------------

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

public class Sponsor {

@SerializedName("leg_id")
@Expose
private String legId;
@SerializedName("type")
@Expose
private String type;
@SerializedName("name")
@Expose
private String name;
@SerializedName("committee_id")
@Expose
private Object committeeId;
@SerializedName("official_type")
@Expose
private String officialType;

public String getLegId() {
    return legId;
}

public void setLegId(String legId) {
    this.legId = legId;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Object getCommitteeId() {
    return committeeId;
}

public void setCommitteeId(Object committeeId) {
    this.committeeId = committeeId;
}

public String getOfficialType() {
    return officialType;
}

public void setOfficialType(String officialType) {
    this.officialType = officialType;
}

}

在您的結果中設置在 SponsorsModel 之上。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM