Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在kotlin中使用改型解析JSON对象_Android_Json_Kotlin_Retrofit - Fatal编程技术网

Android 在kotlin中使用改型解析JSON对象

Android 在kotlin中使用改型解析JSON对象,android,json,kotlin,retrofit,Android,Json,Kotlin,Retrofit,我试图使用kotlin中的翻新库来显示json数据 这是我的Json: [ { "login": "mojombo", "id": 1, }, { "login": "defunkt", "id": 2, } ] 我的主要活动 call.enqueue(object : Callback<UserResponse> { override fun onResponse(call: Call<UserResp

我试图使用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())
        }
    })
call.enqueue(对象:回调{
覆盖fun onResponse(调用:调用,响应:响应){
Log.e(“列表”、“列表”)
val countrylist=response.body()
对于(响应中的大小.body()){
System.out.println(size.toString())
}
//var listOfMovies:List=response.body()?.results!!
//myCustomAdapter=UserListAdapter(applicationContext,listOfMovies)
//recyclerView.setAdapter(myCustomAdapter)
progressBar.visibility=View.GONE
}
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
progressBar.visibility=View.GONE
Log.e(“list”,t.toString())
}
})

这就是我们应用程序上的功能

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!!)

        }
    })

}

}

希望这能有所帮助。

这就是我们的应用程序

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!!)

        }
    })

}

}

希望这会有所帮助。

这是我在kotlin中使用改型和rxjava构建的一个应用程序,使用测试API以最好的方式实现

模型

改装包

IMyApi接口

interface IMyApi {

@get:GET("posts")
val posts: Observable<List<Post>>
}
适配器包

后适应级

  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()
                }
            }
主要活动

  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
                    }
                }
class MainActivity:AppCompatActivity(){
私有lateinit var jsonApi:IMyApi
私有变量compositeDisposable:compositeDisposable=compositeDisposable()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//初始化api
val REFRONATION=REFRONATIONCLIENT.instance
jsonApi=reformation.create(IMyApi::class.java)
//看法
回收商_posts.layoutManager=LinearLayoutManager(此)
回收商_posts.setHasFixedSize(真)
fetchData()
}
私有数据(){
compositeDisposable.add(jsonApi.posts
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe{posts->displayData(posts)})
}
私人娱乐显示数据(帖子:列表?){
val adapter=PostAdapter(这个,posts!!)
回收器\u posts.adapter=适配器
}
}

如上图所示,使用它将帮助您满怀希望地解决您的问题。此外,在代码中,您还会遇到“回收站帖子”。这是添加到活动_main中的回收者的id。如果您需要我将其包括在内,请让我知道这是我在kotlin中使用改型和rxjava以测试API的最佳方式构建的应用程序

模型

改装包

IMyApi接口

interface IMyApi {

@get:GET("posts")
val posts: Observable<List<Post>>
}
适配器包

后适应级

  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()
                }
            }
主要活动

  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
                    }
                }
class MainActivity:AppCompatActivity(){
私有lateinit var jsonApi:IMyApi
私有变量compositeDisposable:compositeDisposable=compositeDisposable()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//初始化api
val REFRONATION=REFRONATIONCLIENT.instance
jsonApi=reformation.create(IMyApi::class.java)
//看法
回收商_posts.layoutManager=LinearLayoutManager(此)
回收商_posts.setHasFixedSize(真)
fetchData()
}
私有数据(){
compositeDisposable.add(jsonApi.posts
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe{posts->displayData(posts)})
}
私人娱乐显示数据(帖子:列表?){
val adapter=PostAdapter(这个,posts!!)
回收器\u posts.adapter=适配器
}
}

如上图所示,使用它将帮助您满怀希望地解决您的问题。此外,在代码中,您还会遇到“回收站帖子”。这是添加到活动_main中的回收者的id。如果您需要我将其包括在内,请让我知道

Hi,如果您打印您的响应。body()您得到了什么?如果您已经得到了响应,您需要使用gson解析它,然后您将能够获得pojo的元素,并且可能不会在响应中循环。body()正如你们所做的。我的错是我在写代码,你们从列表中只得到一项。正因为如此,我得到了JSON exceptionHi,如果你打印你的response.body(),你会得到什么?如果你已经得到了响应,你可能需要使用gson解析它,然后你就可以得到pojo的元素,可能不会在response.body()中循环正如你们所做的。我的错是我在写代码,你们从列表中只得到一项。因此,我得到了JSON exceptionGetFAQs是使用json2schema网站检索的模型类。GetFAQs是使用json2schema网站检索的模型类。