>

일부 배열 값을 반환하는 API 요청을 만들고 있습니다. 내가 (문자열 유형입니다) 자신의 해당 클래스 속성에 할당 할 수 있도록 나는이 배열 값을 직렬화 할 필요가있다.

이제 GSON을 사용하여 목록을 직렬화 및 역 직렬화하는 방법을 알고 있지만 Retrofit을 사용하면 매핑이 자동으로 수행됩니다. 이는 내 속성이 String 유형 인 경우 API 호출에서 "문자열을 예상했지만 대신 배열을 수신했습니다"라는 오류를 반환합니다. 이 문제를 해결하여 실패없이 배열로 수신하고 나중에 문자열로 저장하는 방법은 무엇입니까?

내 API 응답 :

{
"utterances": [{
        "langs": ["eng", "afr", "xho", "zul"],
        "utts": [
            "Have you been here before?",
            "Was u al hier gewees?",
            "Ingaba wakhe weza apha ngaphambili?",
            "Ingabe uke weza lapha ngaphambilini?"
        ],
        "responses": [
            ["Yes", "No"],
            ["Ja", "Nee"],
            ["Ewe", "Hayi"],
            ["Yebo", "Cha"]
        ]
    },
    {
        "langs": ["eng", "afr", "xho", "zul"],
        "utts": [
            "How are you?",
            "Hoe gaan dit met jou?",
            "unjani?",
            "unjani?"
        ],
        "responses": [
            ["Good", "Bad"],
            ["Goed", "sleg"],
            ["ezilungileyo", "ezimbi"],
            ["kuhle", "kubi"]
        ]
    }
]
}

내 UtteranceResponse 수업 :

class UtteranceResponse {
@SerializedName("status")
var status: String? = null
@SerializedName("count")
var count: Int = 0
@SerializedName("utterances")
var utterances: ArrayList<Utterance>? = null
}

내 어터 런스 클래스 :

class Utterance: SugarRecord {
@SerializedName ("langs")
var langs: String? = null
@SerializedName ("utts")
var utterances_text: String? = null
var utterances_tts: String? = null
@SerializedName ("responses")
var responses_text: String? = null
constructor(){
}
}

마지막으로 호출 기능 :

   fun getUtterancesFromWebservice (){
    val apiService = ApiInterface.create()
    val call = apiService.getUtteranceDetails()
    call.enqueue(object: Callback<UtteranceResponse> {
        override fun onResponse(call: Call<UtteranceResponse>, response: retrofit2.Response<UtteranceResponse>?) {
            if (response != null) {
                if (response.body()?.utterances != null){
                    var list: List<Utterance> = response.body()?.utterances!!
                    val utterances: Utterance = list[0]
                    //storeUtterancesFromList(list)
                } else {
                    Log.d ("Response:", response.body().toString())
                }
            }else{
                Log.d ("responseResult", "NULL")
            }
        }
        override fun onFailure(call: Call<UtteranceResponse>, t: Throwable) {
            Log.e("SHIT", t.toString())
        }
    })
}

업데이트 내 API 인터페이스도 :

@GET("bins/1ahazo")
abstract fun getUtteranceDetails():Call<UtteranceResponse>
    companion object Factory {
        const val BASE_URL = "https://api.myjson.com/"
        fun create(): ApiInterface {
            val gson = GsonBuilder().setPrettyPrinting().create()
            val retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
            return retrofit.create(ApiInterface::class.java)
        }
    }

  • 답변 # 1

    목록에없는 단일 객체를 반환합니다. Call<UtteranceResponse> 변경  ApiInterface에서

    Call<List<Utterance>>
    
    

    및 목록 문자열 및 문자열에 문자열리스트 목록을 변환

    class Utterance: SugarRecord {
    @SerializedName ("langs")
    var langs: List<String?>? = null 
    @SerializedName ("utts")
    var utterances_text: String? = null
    var utterances_tts: List<String?>? = null
    @SerializedName ("responses")
    var responses_tex:List<List<String?>?>? = null;
    constructor(){
     }
    }
    
    

  • 이전 reactjs - redux-form 7 검증 - 기능성 구성 요소
  • 다음 javascript - 열에서 반복되는 값 제거