【问题标题】:parse JSON object using retrofit in kotlin在 kotlin 中使用改造解析 JSON 对象
【发布时间】:2019-02-13 18:02:18
【问题描述】:

我正在尝试使用 kotlin 中的改造库显示 json 数据

这是我的 Json:

[
  {
    "login": "mojombo",
    "id": 1,

  },
  {
    "login": "defunkt",
    "id": 2,
    }
]

我的主要活动

 call.enqueue(object : Callback<UserResponse> {
        override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>) {
            Log.e("list","list")
            val countrylist = response.body()
            for (size in response.body()) {
                System.out.println(size.toString())
            }

            // var listOfMovies: List<UserResponse> = response.body()?.results!!
           // myCustomAdapter = UserListAdapter(applicationContext, listOfMovies)
          //  recyclerView.setAdapter(myCustomAdapter)
            progressBar.visibility = View.GONE
        }

        override fun onFailure(call: Call<UserResponse>?, t: Throwable?) {
            progressBar.visibility = View.GONE
            Log.e("list", t.toString())
        }
    })

【问题讨论】:

  • 嗨,如果你打印你的 response.body() 你会得到什么?
  • 如果已经得到响应,您可能需要使用 gson 解析它,然后您将能够获取 pojo 的元素,并且可能不会像您那样循环通过 response.body()正在做。
  • 我的错误是我只写代码你从列表中得到一个项目。因此我得到了 JSON 异常

标签: android json kotlin retrofit


【解决方案1】:

这是我在 kotlin 中使用改造和 rxjava 以最好的方式使用测试 API 构建的应用程序。

型号

data class Post( val userID:Int, val title:String, val body: String)

改装包

IMyApi 接口

interface IMyApi {

@get:GET("posts")
val posts: Observable<List<Post>>
}

RetrofitClient 对象类

object RetrofitClient {


val instance: Retrofit by lazy {
    Retrofit.Builder()
        .baseUrl("https://jsonplaceholder.typicode.com/")
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .build()
 }
}

适配器包

PostAdapter 类

  class PostAdapter(private val context: Context, private val postList: List<Post>)
                :RecyclerView.Adapter<PostViewHolder>()
            {
                override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
   PostViewHolder {
                    val itemView = LayoutInflater.from(parent.context)
                        .inflate(R.layout.post_item, parent, false)
                    return PostViewHolder(itemView)
                }

                override fun getItemCount(): Int {
                    return postList.size
                }

                   override fun onBindViewHolder(holder: PostViewHolder, position: Int) 
    {
                    holder.userId.text = postList[position].userID.toString()
                    holder.title.text = postList[position].title
                    holder.body.text = StringBuilder(postList[position].body.substring(0,20))
                        .append("...").toString()
                }
            }

PostViewHolder 类

class PostViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) {

var userId = itemView.txtID
var title = itemView.txtTitle
var body = itemView.txtBody
}

主活动

  class MainActivity : AppCompatActivity() {

                    private lateinit var jsonApi: IMyApi
                    private var compositeDisposable: CompositeDisposable = CompositeDisposable()

                    override fun onCreate(savedInstanceState: Bundle?) {
                        super.onCreate(savedInstanceState)
                        setContentView(R.layout.activity_main)

                        // Init api
                        val retrofit = RetrofitClient.instance
                        jsonApi = retrofit.create(IMyApi::class.java)


                        // View
                        recycler_posts.layoutManager = LinearLayoutManager(this)
                        recycler_posts.setHasFixedSize(true)
                        fetchData()
                    }

                    private fun fetchData() {
                        compositeDisposable.add(jsonApi.posts
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe { posts->displayData(posts)})
                    }

                    private fun displayData(posts: List<Post>?) {
                        val adapter = PostAdapter(this, posts!!)
                        recycler_posts.adapter = adapter
                    }
                }

如上所示使用它应该可以帮助您解决问题。此外,当您在代码中遇到“recycler_posts”时。这是在activity_main 中添加的recycler 的id。如果您需要我包含,请告诉我

【讨论】:

    【解决方案2】:

    这就是我们的应用程序所拥有的

    object GetFAQsAPI {
    
    private val LOG_TAG = GetFAQsAPI.javaClass.simpleName
    
    interface ThisCallback {
    
        fun onSuccess(getFAQs: GetFAQs)
    
        fun onFailure(failureMessage: String)
    
        fun onError(errorMessage: String)
    }
    
    /* POST */
    fun postData(jo: JsonObject, callback: GetFAQsAPI.ThisCallback) {
        val call = Service.getService().get_faqs(jo)
        call.enqueue(object : Callback<JsonObject> {
    
            override fun onResponse(call: Call<JsonObject>, response: Response<JsonObject>) {
    
                //Log.e(LOG_TAG, response.body().toString());
    
                try {
                    if (response.body()?.get("success")!!.asBoolean) {
    
                        val gson = GsonBuilder().setPrettyPrinting().create()
                        val getFAQs = gson.fromJson(response.body(), GetFAQs::class.java)
    
                        callback.onSuccess(getFAQs)
    
                    } else {
                        Log.e(LOG_TAG, "else")
    
                        val error = response.body()!!.get("err").asString
    
                        callback.onError(error)
                    }
    
                } catch (e: Exception) {
                    Log.e(LOG_TAG, "exception" + e.localizedMessage)
    
                    callback.onFailure(e.message!!)
                }
    
            }
    
            override fun onFailure(call: Call<JsonObject>, t: Throwable) {
                Log.e(LOG_TAG, "onFailure: " + t.message)
    
                callback.onFailure(t.message!!)
    
            }
        })
    
    }
    
    }
    

    这就是我们从片段中调用它的方式 - getFAQs 是解析的对象。

    private fun getFAQsAPI() {
    
        showLoading(true)
    
        val jo = JsonObject().apply {
            addProperty("faq_category", "admin")
        }
    
        GetFAQsAPI.postData(jo, object : GetFAQsAPI.ThisCallback {
            override fun onSuccess(getFAQs: GetFAQs) {
                Log.i(LOG_TAG, "onSuccess")
    
                showLoading(false)
    
                updateUI(getFAQs)
            }
    
            override fun onFailure(failureMessage: String) {
                Log.e(LOG_TAG, failureMessage)
            }
    
            override fun onError(errorMessage: String) {
                Log.e(LOG_TAG, errorMessage)
            }
        })
    }
    

    希望对您有所帮助。

    【讨论】:

    • GetFAQs 是使用 json2schema 网站检索到的模型类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2021-12-09
    • 2021-07-03
    • 2018-09-23
    • 2020-02-29
    • 2016-02-13
    相关资源
    最近更新 更多