最近做了人脸识别终端的项目,学习到了很多,总结一下对服务器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在线工具