簡體   English   中英

Retrofit和Moshi:解析具有兩個數組的JSON對象

[英]Retrofit and Moshi: Parsing a JSON Object with Two Arrays

在學習如何在Moshi中使用Retrofit和在Android中使用API​​的過程中,我遇到了一個無法解決的問題。 這里的目標是獲得從API返回的類別的簡單數組。 在這種情況下,當我調用Behance API列出所有creativefields時,不會返回數組。 而是一個具有兩個數組的對象:

{"fields":[{"id":108,"name":"Advertising"},{"id":3,"name":"Animation"},{"id":4,"name":"Architecture"},{"id":5,"name":"Art Direction"},{"id":130,"name":"Automotive Design"},{"id":109,"name":"Branding"},{"id":133,"name":"Calligraphy"},{"id":9,"name":"Cartooning"},{"id":124,"name":"Character Design"},{"id":12,"name":"Cinematography"},{"id":15,"name":"Computer Animation"},{"id":19,"name":"Copywriting"},{"id":20,"name":"Costume Design"},{"id":21,"name":"Crafts"},{"id":137,"name":"Creative Direction"},{"id":23,"name":"Culinary Arts"},{"id":122,"name":"Digital Art"},{"id":27,"name":"Digital Photography"},{"id":28,"name":"Directing"},{"id":110,"name":"Drawing"},{"id":31,"name":"Editing"},{"id":32,"name":"Editorial Design"},{"id":33,"name":"Engineering"},{"id":35,"name":"Entrepreneurship"},{"id":36,"name":"Exhibition Design"},{"id":37,"name":"Fashion"},{"id":93,"name":"Fashion Styling"},{"id":38,"name":"Film"},{"id":112,"name":"Fine Arts"},{"id":40,"name":"Furniture Design"},{"id":41,"name":"Game Design"},{"id":43,"name":"Graffiti"},{"id":44,"name":"Graphic Design"},{"id":131,"name":"Icon Design"},{"id":48,"name":"Illustration"},{"id":49,"name":"Industrial Design"},{"id":50,"name":"Information Architecture"},{"id":51,"name":"Interaction Design"},{"id":52,"name":"Interior Design"},{"id":53,"name":"Jewelry Design"},{"id":54,"name":"Journalism"},{"id":55,"name":"Landscape Design"},{"id":59,"name":"MakeUp Arts (MUA)"},{"id":63,"name":"Motion Graphics"},{"id":64,"name":"Music"},{"id":66,"name":"Packaging"},{"id":67,"name":"Painting"},{"id":69,"name":"Pattern Design"},{"id":70,"name":"Performing Arts"},{"id":73,"name":"Photography"},{"id":74,"name":"Photojournalism"},{"id":78,"name":"Print Design"},{"id":79,"name":"Product Design"},{"id":123,"name":"Programming"},{"id":136,"name":"Retouching"},{"id":86,"name":"Sculpting"},{"id":87,"name":"Set Design"},{"id":118,"name":"Sound Design"},{"id":91,"name":"Storyboarding"},{"id":135,"name":"Street Art"},{"id":95,"name":"Textile Design"},{"id":126,"name":"Toy Design"},{"id":97,"name":"Typography"},{"id":132,"name":"UI\/UX"},{"id":120,"name":"Visual Effects"},{"id":102,"name":"Web Design"},{"id":103,"name":"Web Development"},{"id":105,"name":"Writing"}],
"popular":[{"id":44,"name":"Graphic Design"},{"id":73,"name":"Photography"},{"id":51,"name":"Interaction Design"},{"id":5,"name":"Art Direction"},{"id":48,"name":"Illustration"},{"id":49,"name":"Industrial Design"},{"id":63,"name":"Motion Graphics"},{"id":37,"name":"Fashion"},{"id":4,"name":"Architecture"},{"id":109,"name":"Branding"},{"id":102,"name":"Web Design"},{"id":132,"name":"UI\/UX"}],"http_code":200}

如何使用Moshi和Retrofit解析此JSON響應以獲得兩個數組的創意字段? 以下是我預期可以使用的設置。 現在,我知道JSON不是List,而是更多的FieldList,具有“ fields”和“ popular”兩個值,但是我看不到如何使用Moshi提取數組。

創意領域的模型

data class Fields(val id: Int, val name: String)

接口/服務

interface BehanceService{

@GET( "v2/fields")
fun creativeField(@Query("api_key") api_key: String): Call<List<Fields>>
}

API類

object BehanceAPI {
    private val BASE_URL = "http://www.behance.net/"



    val retrofittedBuilder: Retrofit by lazy {
        Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(MoshiConverterFactory.create())
                .build()
    }

    val behanceService: BehanceService = retrofittedBuilder.create(BehanceService::class.java)

}

這就是您的json看起來像Java模型的樣子

data class Response(
val httpCode: Int? = null,
val fields: List<FieldsItem?>? = null,
val popular: List<PopularItem?>? = null)

data class FieldsItem(
val name: String? = null,
val id: Int? = null)

data class PopularItem(
val name: String? = null,
val id: Int? = null)

您的服務將是這樣的:

interface BehanceService{
@GET("v2/fields")
fun creativeField(@Query("api_key") api_key: String): Call<Response>
}

您的Api類將是這樣的:

object BehanceAPI {
private val BASE_URL = "http://www.behance.net/"



val retrofittedBuilder: Retrofit by lazy {
    Retrofit.Builder().baseUrl(BASE_URL)
            .addConverterFactory(MoshiConverterFactory.create())
            .build()
}

val behanceService: BehanceService = retrofittedBuilder.create(BehanceService::class.java)}

您可以用這種方式來稱呼它。

BehanceAPI.behanceService.creativeField("your_key_here").enqueue(new Call<Response>(){
@Override
public void onResponse( response: Call<Response>)
{
    // Deal with the response here
    val data = response.body();
}

@Override
public void onFailure(Throwable t)
{
    // Deal with the error here
}})

暫無
暫無

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

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