Soru Nasıl Kotlin içinde JSON ayrılır?


JSON nesnesine ayrıştırmam gereken bir hizmetten oldukça derin bir JSON nesne dizesi alıyorum ve sonra bunları sınıflara eşleştiriyorum.

Bir JSON dizesini Kotlin'deki nesneye nasıl dönüştürebilirim?

Bundan sonra ilgili sınıflara eşleme, Jackson'dan StdDeserializer kullanıyordum. Sorun, nesnenin aynı zamanda sınıflara serileştirilmesi gereken özelliklere sahip olduğu anda ortaya çıkar. Nesne eşleştiricisini alamadım, en azından nasıl olduğunu bilmiyordum, başka bir desperizer içinde.

Herhangi bir yardım için şimdiden teşekkür ederiz. Tercihen, doğal olarak, ihtiyacım olan bağımlılık sayısını azaltmaya çalışıyorum, eğer cevabın sadece JSON manipülasyonu ve ayrıştırılması yeterliyse yeterli olur.


30
2018-01-30 03:56


Menşei


Kotlin olmadan aynı şekilde. Ayrıştırma json java'ya özgü değil. Kotlin, Java sınıf dosyalarını derler. Kotlin standart kütüphanesi yüklü mü? Aynı hatayı alıp almadığınızı görmek için GSON gibi başka bir Haritacı denediniz mi? - Mr00Anderson
Java'da geliştirmedim. Aldığım bir hata değil. Sadece yerel olarak Kotlin'de nasıl etkili bir şekilde ayrıştırılacağını bilmiyorum. Tüm aramalar her zaman bir çerçeveye yol açar. Java bir org.json.simple vardır. IDE'nin otomatik tamamlama özelliklerine güvenerek, Kotlin yapmıyor. - AJ_1310
Org.json.simple paketi Java'ya özgü değil. Sanırım bu kütüphane: github.com/fangyidong/json-simple. İsterseniz Kotlin ile de kullanabilirsiniz (Jason Bourne'un önerdiği klaxon kütüphanesi Kotlin için daha iyi bir seçenek olabilir). - marstran
Şuna baksana github.com/square/moshi. Bu konuda bir blog yazısı var medium.com/square-corner-blog/... - James Moore


Cevaplar:


Bu kütüphaneyi kullanabilirsiniz https://github.com/cbeust/klaxon

Klaxon, Kotlin'deki JSON'u ayrıştırmak için hafif bir kütüphanedir.


18
2018-01-30 04:41



Yazar / sorularınız varsa, bana e-posta göndermekten çekinmeyin. - Cedric Beust
Doğru Ayrıştırıcıyı almak için hangi Java kütüphanelerini almam gerekiyor? Org.json'u denedim. * Ama Gradle ayarlarında bir şey eksik olmalıyım. Klaxon belgelerinin çok fazla olduğunu sanıyorum (kullanıcı Java kütüphanelerini bildiği gibi). - Makis
@CedricBeust sqlite ile sınıf nesnesiyle çalışmayı denediniz mi? Burada önerilen herhangi bir uygulama? - Raju yourPepe


Kotlin'de ayrışmanın geleceğinin kotlinx.serialization ile olacağı sorusu yoktur. Kotlin kütüphanelerinin bir parçasıdır. Hala inkübatör aşamasında yazıyor.

https://github.com/Kotlin/kotlinx.serialization


11
2018-02-21 10:56





İhtiyacın olan şey bu olduğundan emin değilim, ama ben böyle yaptım.

İmport org.json.JSONObject öğesini kullanarak:

    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
    }

İşte jsonun bir örneği: {   "Yemekler": {     "FoodName": "Elmalar",     "Ağırlık": "110"   } }


8
2018-01-30 18:48



bağımlılık nedir? - Luís Soares
@ LuísSoares Bu benim kullandığım şey mvnrepository.com/artifact/org.json/json - markB


Burada bulabileceğin Jacksonlin Jackson modülünü kişisel olarak kullanıyorum: Jackson-modülü-KOTLIN.

implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$version"

Örnek olarak, oldukça ağır olan Sürgülü Yol Çizelgesi'nin JSON'sunu ayrıştırmak için kod (burada biçimlendirildiğinde 84k satır):

Açıklamanız gereği, ihtiyaçlarınızı karşıladığını düşünüyorum.


7
2018-02-03 00:34





Kullanabilirsiniz Gson .

Örnek

Aşama 1

Derleme ekle

compile 'com.google.code.gson:gson:2.8.2'

Adım 2

Json'u dönüştürün Kotlin Bean(Kullanım JsonToKotlinClass)

Bunun gibi

Json veri

{
"timestamp": "2018-02-13 15:45:45",
"code": "OK",
"message": "user info",
"path": "/user/info",
"data": {
    "userId": 8,
    "avatar": "/uploads/image/20180115/1516009286213053126.jpeg",
    "nickname": "",
    "gender": 0,
    "birthday": 1525968000000,
    "age": 0,
    "province": "",
    "city": "",
    "district": "",
    "workStatus": "Student",
    "userType": 0
},
"errorDetail": null
}

Kotlin Bean

class MineUserEntity {

    data class MineUserInfo(
        val timestamp: String,
        val code: String,
        val message: String,
        val path: String,
        val data: Data,
        val errorDetail: Any
    )

    data class Data(
        val userId: Int,
        val avatar: String,
        val nickname: String,
        val gender: Int,
        val birthday: Long,
        val age: Int,
        val province: String,
        val city: String,
        val district: String,
        val workStatus: String,
        val userType: Int
    )
}

Aşama 3

kullanım Gson

var gson = Gson()
var mMineUserEntity = gson?.fromJson(response, MineUserEntity.MineUserInfo::class.java)

6
2018-02-13 07:54





Harici kütüphane olmadan

Bunu ayrıştırmak için:

val parseMe = """
    {
       "type":"Foo",
       "data":[
          {
             "id":1,
             "title":"Hello"
          },
          {
             "id":2,
             "title":"World"
          }
       ]
    }        
"""

Bu sınıfları kullan:

import org.json.JSONObject

class JSONFoos(json: String) : JSONObject(json) {
    val type: String? = this.optString("type")
    val data = this.optJSONArray("data")
            ?.let { 0.until(it.length()).map { i -> it.optJSONObject(i) } } // returns an array of JSONObject
            ?.map { JSONFoo(it.toString()) } // transforms each JSONObject of the array into JSONFoo
}

class JSONFoo(json: String) : JSONObject(json) {
    val id = this.optInt("id")
    val title: String? = this.optString("title")
}

Kullanımı:

val foos = JSONFoos(parseMe)

4
2018-05-22 12:45



vay bu harika !!!!! - Anirudha Mahale


Her şeyden önce.

Android Studio'da JSON için JSON mapping'i (kotlin data sınıfı) POJO sınıflarına eşlemek için JSON - Kotlin Data sınıfı çevirici eklentisini kullanabilirsiniz. Bu eklenti, Kotlin veri sınıfınızı JSON'a göre not edecektir.

Daha sonra, JSON'u Kotlin'e dönüştürmek için GSON dönüştürücüyü kullanabilirsiniz.

Bu Tamamlanmış eğiticiyi takip edin: Kotlin Android JSON Ayrıştırma Eğitimi

Json'u manuel olarak ayrıştırmak isterseniz.

val **sampleJson** = """
  [
  {
   "userId": 1,
   "id": 1,
   "title": "sunt aut facere repellat provident occaecati excepturi optio 
    reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita"
   }]
   """

JSON Dizisi ve nesnesi dizin 0'da ayrıştırılacak kod.

var jsonArray = JSONArray(sampleJson)
for (jsonIndex in 0..(jsonArray.length() - 1)) {
Log.d("JSON", jsonArray.getJSONObject(jsonIndex).getString("title"))
}

2
2018-05-04 07:34





http://www.jsonschema2pojo.org/   Merhaba json pojo dönüştürmek için bu web sitesini kullanabilirsiniz.
  Kontrol + Alt + shift + k

Bundan sonra o model sınıfını kotlin model sınıfına çevirebilirsiniz. Yukarıdaki kısayol yardımı ile.


1
2018-06-26 13:21





Deme kaynağını buradan indirin (Android kotlin ayrıştırma Json)

Bu bağımlılığı ekle:

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

Api işlevini çağırın:

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

        }

    })

-2
2018-01-02 10:13



O bir http istemcisi istemiyordu ama sadece bir json ayrıştırıcısı için ... - Willi Mentzel