moshi是square出品的面向Java和Kotlin的JSON解析库,尤其适合基于Kotlin的Android开发。https://github.com/square/moshi
gradle 引入
compile 'com.squareup.moshi:moshi-kotlin:$latest_version'
POJO定义
data class
data class User(val name:String,val detail:UserDetail)
data class UserDetail(val age:Int, val job:String)
creator
fun createUser():User{
return User("Jack",UserDetail(25,"Sales"));
}
fun createMultiUser(): List<User> {
return listOf<User>(User("Jack",UserDetail(25,"Sales")),
User("Pony",UserDetail(30,"Marketing")),
User("Robin",UserDetail(31,"Engineer")))
}
JSON解析
CLASS→JSON
val user = createUser()
// CLASS -> JSON
val moshi = Moshi.Builder().build()
val adapter = moshi.adapter(User::class.java)
val decodeJson = adapter.toJson(user)
println("CLASS→JSON:${decodeJson}")
通过Pojo类信息创建adapter
,然后通过其toJson
传入实际对象进行转换
output:
--------
CLASS→JSON:{"detail":{"age":25,"job":"Sales"},"name":"Jack"}
JSON→CLASS
// JSON→CLASS
val json = "{\"detail\":{\"age\":30,\"job\":\"Sales\"},\"name\":\"Ben\"}"
val fromJson = adapter.fromJson(json)
println("JSON→CLASS:${fromJson}")
通过adapter
的fromJson
将JSON你转换为CLASS
output:
--------
JSON→CLASS:User(name=Ben, detail=UserDetail(age=30, job=Sales))
LIST的JSON解析
LIST→JSON
val type = Types.newParameterizedType(List::class.java,User::class.java)
val listAdapter:JsonAdapter<List<User>> = moshi.adapter(type)
val multiUserJson = listAdapter.toJson(createMultiUser())
println("LIST→JSON:${multiUserJson}")
创建adapter时需要List中泛型信息,所以先通过Types.newParameterizedType
创建参数化化类型的type,然后基于type创建adapter,最后再通过toJson进行转换
output:
---------
LIST→JSON:[{"detail":{"age":25,"job":"Sales"},"name":"Jack"},{"detail":{"age":30,"job":"Marketing"},"name":"Pony"},{"detail":{"age":31,"job":"Engineer"},"name":"Robin"}]
JSON→LIST
val file = File("src/main/resources/list_data.json")
val fileContents = file.absoluteFile.bufferedReader().use { it.readText() }
val listObject = listAdapter.fromJson(fileContents);
println("JSON→LIST:${listObject}")
list_data.json中的内容如下:
[
{
"name": "Jack",
"detail": {
"age": 25,
"job": "Sales"
}
},
{
"name": "Pony",
"detail": {
"age": 31,
"job": "Marketing"
}
},
{
"name": "Robin",
"detail": {
"age": 30,
"job": "Engineer"
}
}
]
output:
---------
JSON→LIST:[User(name=Jack, detail=UserDetail(age=25, job=Sales)), User(name=Pony, detail=UserDetail(age=31, job=Marketing)), User(name=Robin, detail=UserDetail(age=30, job=Engineer))]