Kotlin使用okhttp3和gson对服务端JSON报文的高效处理

最近做了人脸识别终端的项目,学习到了很多,总结一下对服务器json的处理方式,结合使用okhttp3和gson,既简单又高效。

一、准备

1.先在app的build.gradle中加入依赖

    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation 'com.google.code.gson:gson:2.9.0'

2.确保你有一个接口可以请求,比如

http://192.168.0.110:7001/api/GetUser

3.确认与接口请求发送的报文是GET还是POST,POST要带一串Body请求参数,比如

{
    "id": 123,
    "type":1000
}

4.确认返回的报文响应内容字段名称,比如

{
	"States": 1000,
	"Message": "操作成功",
	"Data": [
		{
			"UserId": 1,
			"FaceImage": "http://192.168.0.110:7003//Uploads/Face/1.jpg"
		},
		{
			"UserId": 2,
			"FaceImage": "http://192.168.0.110:7003//Uploads/Face/2.jpg"
		},
		{
			"UserId": 3,
			"FaceImage": "http://192.168.0.110:7003//Uploads/Face/3.jpg"
		},
		{
			"UserId": 4,
			"FaceImage": "http://192.168.0.110:7003//Uploads/Face/4.jpg"
		},
		{
			"UserId": 5,
			"FaceImage": "http://192.168.0.110:7003//Uploads/Face/5.jpg"
		}
	]
}

二、初始化

1.确认好报文内容的字段名称后,创建一个名为GetUser的数据类将字段变为变量,方便对json的内容进行初始化和使用,其中Data是个数组,创建一个名为Data的数据类并作为List的泛型

data class GetUser(
    val Data: List,
    val Message: String,
    val States: Int
)

data class Data(
    val UserId: Int,
    val FaceImage: String
   
)

2.新建一个类作为viewModels的model,使用okhttp对接口发送请求,在FormBody.Builder()中添加Body请求参数, 在Request.Builder()中添加url和post方法并传入body参数,

var use = "http://192.168.0.110:7001"
var url = "$use/api/GetUser"
lateinit var responseData:String

fun sendRequestGetUser(id: String,Type:String) {
        val body = FormBody.Builder()
            .add("id", id)
            .add("type",type)
            .build()
        val client = OkHttpClient().newBuilder()
            .connectTimeout(60000, TimeUnit.MILLISECONDS)
            .readTimeout(60000, TimeUnit.MILLISECONDS)
            .build()
        try {
            val request = Request.Builder()
                .url(url)
                .post(body)
                .build()
            val response = client.newCall(request).execute()
            responseData = response.body!!.string()
        
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

三、请求和处理

1.在主类中使用viewModels对上述的类进行封装命名为apiModel使用。在线程中先请求一次apiModel.sendRequestGetUser(id,type) ,拿到返回的responseData     

private fun getUser(id:String,type:String){
        object : Thread() {
            override fun run() {      
                    apiModel.sendRequestGetUser(id,type)
                    try{
                        apiGetUser = gson.fromJson(apiModel.responseData,GetUser::class.java)
                        Log.d("order1", apiFaceOrder.toString())
                        sleep(2000)                                 
                    }catch (e:Exception){
                        e.printStackTrace()
                    }
            }
        }.start()
    }

2.处理返回的responseData,此时responseData中存放的是返回的json报文,压缩后以字符串的形式存在,我们需要把各字段单独提取出来,方便使用,这里就需要用的gson和开头创建的数据类了。我们使用gson.fromJson(返回的json报文,数据类),gson会自动解析字符串与变量名并对应生成,可以很方便的将字段变为变量使用。将apiGetUser定义为GetUser数据类型,不要忘了延迟初始化apiGetUser否则会报错。

lateinit var apiGetUser: GetUser

apiGetUser = gson.fromJson(apiModel.responseData,GetUser::class.java)

3.此时apiGetUser中可以直接使用json传来的字符串作为变量了,也就是说可以直接点出来,apiGetUser.States,现在可以使用state进行判断是否请求成功。我得到的states等于1000表示接口请求成功了,返回了用户的Data。

if(apiGetUser.States==1000){
//代码实现
}

4.当有多个用户的时候,Data数组也会存放相应数量的元素,而使用的方法也很简单,对Data的size进行一个遍历一个个取出即可。

for ( i in 0 until apiGetUser.Data.size){
    var userid = apiGetUser.Data[i].UserId
    var userFace = apiGetUser.Data[i].FaceImage
}

没了...

推荐一个网站可以处理json报文,格式化,转义和压缩,非常方便测试JSON在线 | JSON解析格式化—SO JSON在线工具 

你可能感兴趣的:(Kotlin,kotlin,json,android)