如何在Kotlin中解析JSON?

我从服务中收到一个相当深的JSON对象字符串,我必须解析到一个JSON对象,然后将其映射到类。

如何将JSON字符串转换为Kotlin中的对象?

之后,映射到相应的类,我使用jackson的StdDeserializer。 问题出现在对象具有也必须被反序列化为类的属性的时刻。 我无法得到对象映射器,至少我不知道如何,在另一个反序列化器内。

在此先感谢您的帮助。 最好,本地,我试图减少我需要的依赖关系的数量,所以如果答案只是对JSON的操纵和分析它就够了。

你可以使用这个库https://github.com/cbeust/klaxon

Klaxon是一个轻量级库,用于解析Kotlin中的JSON。

不知道这是你需要的,但这是我做到的。

使用import org.json.JSONObject:

val jsonObj = JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1)) val foodJson = jsonObj.getJSONArray("Foods") for (i in 0..foodJson!!.length() - 1) { val categories = FoodCategoryObject() val name = foodJson.getJSONObject(i).getString("FoodName") categories.name = name } 

下面是json的示例:{“Foods”:{“FoodName”:“Apples”,“Weight”:“110”}}

我个人使用jackson模块kotlin,你可以在这里find:github.com/FasterXML/jackson-module-kotlin。

作为一个例子,下面是解析Exile skilltree路径的json的代码,它很重(格式化的时候有84k行):

  • kotlin代码: http ://pastebin.com/iLY7hbhf
  • (未格式化的)json: http : //filebin.ca/3B3reNQf3KXJ/rawSkilltree.json

鉴于你的描述,我相信它符合你的需求。

从这里下载deme的来源( Json在android kotlin解析 )

添加这个依赖:

 compile 'com.squareup.okhttp3:okhttp:3.8.1' 

调用api函数:

  fun run(url: String) { dialog.show() val request = Request.Builder() .url(url) .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { dialog.dismiss() } override fun onResponse(call: Call, response: Response) { var str_response = response.body()!!.string() val json_contact:JSONObject = JSONObject(str_response) var jsonarray_contacts:JSONArray= json_contact.getJSONArray("contacts") var i:Int = 0 var size:Int = jsonarray_contacts.length() al_details= ArrayList(); for (i in 0.. size-1) { var json_objectdetail:JSONObject=jsonarray_contacts.getJSONObject(i) var model:Model= Model(); model.id=json_objectdetail.getString("id") model.name=json_objectdetail.getString("name") model.email=json_objectdetail.getString("email") model.address=json_objectdetail.getString("address") model.gender=json_objectdetail.getString("gender") al_details.add(model) } runOnUiThread { //stuff that updates ui val obj_adapter : CustomAdapter obj_adapter = CustomAdapter(applicationContext,al_details) lv_details.adapter=obj_adapter } dialog.dismiss() } })