কীভাবে কোটলিনে জেএসএন পার্স করবেন?


121

আমি একটি পরিষেবা থেকে একটি গভীর গভীর JSON অবজেক্ট স্ট্রিং পেয়েছি যা আমাকে অবশ্যই JSON অবজেক্টে পার্স করতে হবে এবং তারপরে এটি ক্লাসে ম্যাপ করতে হবে।

কীভাবে আমি কোটলিনে কোনও জেএসএন স্ট্রিংকে বস্তুতে রূপান্তর করতে পারি?

এরপরে সংশ্লিষ্ট ক্লাসে ম্যাপিংয়ের পরে আমি জ্যাকসনের স্টাডিডিরিসালাইজার ব্যবহার করছিলাম। সমস্যাটি এই মুহুর্তে উত্থাপিত হয় যখন অবজেক্টটির এমন বৈশিষ্ট্য ছিল যা ক্লাসগুলিতেও deserialized করতে হয়েছিল। আমি অবজেক্ট ম্যাপারটি পেতে সক্ষম হইনি, কমপক্ষে আমি কীভাবে জানতাম না, অন্য ডিসরিওলাইজারের ভিতরে।

কোনো সাহায্যের জন্য আগাম ধন্যবাদ। প্রাথমিকভাবে, স্থানীয়ভাবে, আমি আমার প্রয়োজন নির্ভরতাগুলি হ্রাস করার চেষ্টা করছি তাই যদি উত্তরটি কেবল JSON হেরফেরের জন্য হয় এবং এটি পার্সিং যথেষ্ট হয়।


2
আমি জাভাতে বিকাশ করি না। এটি আমি পেতে একটি ত্রুটি নয়। আমি কোটলিনে কীভাবে কার্যকর পার্সিং করতে পারি তা আমি জানি না। সমস্ত অনুসন্ধান সর্বদা একটি কাঠামোর দিকে নিয়ে যায়। জাভাতে একটি org.json.simple রয়েছে। আইডিই এর স্বতঃপূরণ বৈশিষ্ট্যগুলিতে বিশ্বাস করে, কোটলিন তা করেন না।
এজে_1310

Org.json.simple প্যাকেজটি জাভার স্থানীয় নয়। আমার ধারণা এটি এই লাইব্রেরিটি: github.com/fangyidong/json- সিম্পল । আপনি চাইলে আপনি এটি কোটলিনের সাথেও ব্যবহার করতে পারেন (যদিও ক্লাসন লাইব্রেরি জেসন বোর্ন প্রস্তাব করেছিল কোটলিনের জন্য এটি আরও ভাল পছন্দ হতে পারে)।
marstran

উত্তর:


72

আপনি এই গ্রন্থাগারটি https://github.com/cbeust/klaxon ব্যবহার করতে পারেন

ক্লেক্সন কোটলিনে জেএসএন পার্স করার জন্য একটি হালকা ওজনের গ্রন্থাগার।


85
লেখক এখানে, আপনার যদি প্রশ্ন / পরামর্শ থাকে তবে নির্দ্বিধায় আমাকে ইমেল করুন।
সিড্রিক বিস্ট

সঠিক পার্সার পেতে আমার কোন জাভা লাইব্রেরি আমদানি করতে হবে? আমি org.json। * চেষ্টা করেছিলাম, তবে আমার গ্রেডল সেটিংসে অবশ্যই আমি কিছু মিস করছি। আমি মনে করি ক্লাক্সন ডকুমেন্টেশন অনেক বেশি ধরে নিয়েছে (যেমন জাভা লাইব্রেরিগুলি ব্যবহারকারী জানেন)।
মাকিস

@ সিড্রিকবিস্ট আপনি কি স্ক্লাইট দিয়ে ক্লাস অবজেক্টের সাথে কাজ করার চেষ্টা করেছেন? এখানে কোন প্রস্তাবিত অনুশীলন?
রাজু আপনার পেপ

104

কোটলিনে পার্সিংয়ের ভবিষ্যত কোটলিনেক্স.সিরিয়ালাইজেশন নিয়েই থাকবে এমন প্রশ্ন নেই। এটি কোটলিন গ্রন্থাগারের অংশ। এটি ইনকিউবেটর পর্যায়ে লেখার সময় এখনও রয়েছে।

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

import kotlinx.serialization.*
import kotlinx.serialization.json.JSON

@Serializable
data class MyModel(val a: Int, @Optional val b: String = "42")

fun main(args: Array<String>) {

    // serializing objects
    val jsonData = JSON.stringify(MyModel.serializer(), MyModel(42))
    println(jsonData) // {"a": 42, "b": "42"}

    // serializing lists
    val jsonList = JSON.stringify(MyModel.serializer().list, listOf(MyModel(42)))
    println(jsonList) // [{"a": 42, "b": "42"}]

    // parsing data back
    val obj = JSON.parse(MyModel.serializer(), """{"a":42}""")
    println(obj) // MyModel(a=42, b="42")
}

3
আমার এটির সমস্যাটি হ'ল আপনি জেনেরিকের সাথে এটি খুব কম ব্যবহার করতে পারেন। কীভাবে এটি করা যায় তা কমপক্ষে আমি বের করে দেখিনি। এবং আমি অবশ্যই প্রতিবিম্ব ব্যবহার করতে চাই না।
ন্যাট্রোনাইট

3
কোটলিনএক্স সিরিয়ালাইজেশন এখনও পরীক্ষামূলক পর্যায়ে রয়েছে, তাই তারা নতুন প্রকাশে ব্রেকিং পরিবর্তনগুলি প্রবর্তন করে। এছাড়াও, এটি থ্রেড-নিরাপদ নয়, তাই যদি বেশ কয়েকটি থ্রেড Json(এটি সাধারণ) এর একক উদাহরণ ব্যবহার করার চেষ্টা করে তবে আপনার JSON দূষিত হতে পারে । তদতিরিক্ত, বাগ লেবেলটিতে বেশ কয়েকটি উন্মুক্ত গিথুব সমস্যা রয়েছে। সুতরাং, এটি এখনও উত্পাদনে ব্যবহারের জন্য ঝুঁকিপূর্ণ আমি বলব (যদি আপনি সম্ভাব্য সমস্যাগুলি সমাধানে সময় ব্যয় করতে রাজি না হন এবং ঘন ঘন এটি আপডেট করার পরিকল্পনা না করেন)। প্রকল্পটি বিশেষত কোটলিন মাল্টিপ্লাটফর্ম প্রকল্পগুলির জন্য সত্যই আকর্ষণীয় তবে এটি এখনও স্থিতিশীল নয়।
জাভাদ সাদেকজাদেহে

ইতিমধ্যে একটি ব্রেকিং পরিবর্তন আছে বলে মনে হচ্ছে, জেএসনকে এখন জসন বলা হয়
xjcl

এটির জন্য অতিরিক্ত নির্ভরতাও প্রয়োজন, সুতরাং কোনও গাইডের জন্য লিঙ্কটি অনুসরণ করুন
xjcl

34

বাহ্যিক গ্রন্থাগার ছাড়া (অ্যান্ড্রয়েডে)

এটি বিশ্লেষণ করতে:

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

এই ক্লাসগুলি ব্যবহার করুন:

import org.json.JSONObject

class Response(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 { Foo(it.toString()) } // transforms each JSONObject of the array into Foo
}

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

ব্যবহার:

val foos = Response(jsonString)

2
সুতরাং যদি এর জন্য কোনও বাহ্যিক গ্রন্থাগার প্রয়োজন না হয় তবে এর অর্থ org.json.JSONObject স্ট্যান্ডার্ড লাইব্রেরির অংশ হতে পারে?
এখনও_ড্রিমিং_1

@ still_dreaming_1 হ্যাঁ এটি "এপিআই লেভেল 1 এ যুক্ত হয়েছে", সিএফ। বিকাশকারী.অ্যান্ড্রয়েড.
com

আমার ধারণা এটি একটি অ্যান্ড্রয়েড জিনিস? আমি এটি জেভিএমের জন্য কোটলিন বা জাভা স্ট্যান্ডার্ড লাইব্রেরিতে খুঁজছিলাম।
এখনও_ড্রিমিং_1

ওহ হ্যাঁ একেবারে, আমি দুঃখিত যে আমি উত্তরে উল্লেখ করতে ভুলে গেছি! JsonObjectআপনার JVM জাভা 7 এর অধীনে চলতে থাকলে আপনি ব্যবহার করতে পারেন ( ডকস.ওরাকল. com/ জাভা / 7 / এপি / জাভ্যাক্স / জসন / জসনঅজেক্ট। Html )?
ফুরো

ওহ, আমি এটি আগে খুঁজে পাইনি, ধন্যবাদ! জেসনরিডারের মতো আরও কিছু সম্পর্কিত ক্লাস রয়েছে। দেখে মনে হচ্ছে তারা জাভা EE এর অংশ, তবে জাভা এসই নয়। আমি সম্ভবত জাভা ইই তে স্যুইচিং করব।
এখনও_ড্রিমিং_1

25

তুমি ব্যবহার করতে পার Gson

উদাহরণ

ধাপ 1

সংকলন যোগ করুন

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

ধাপ ২

জসনকে রূপান্তর করুন Kotlin Bean( জসনটোকটকলিন ক্লাস ব্যবহার করুন ) )

এটার মত

Json উপাত্ত

{
"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
    )
}

ধাপ 3

ব্যবহার Gson

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

এটি আমাকে java.lang. বেআইনী স্ট্যাটেক্স এক্সপশন দেয়: একটি স্ট্রিং প্রত্যাশা করা হয়েছিল তবে 1 কলাম 700 লাইনে লম্বা ছিল BEGIN_OBJECT
সৃস্টি রায়

আপনার রিটার্নের ডেটা প্রথমে যাচাই করা উচিত @ @ শ্রুতিরোয়
কেলিউইউ

এটি কাজ করেছিল, তবে আমার জসন প্রতিক্রিয়া যদি "বিভাগগুলি" এর মতো হয়: ["প্রস্তাবিত"], তাহলে?
কৃষ্ণ রায়

@ শ্রীশৈত্রির প্রতিক্রিয়া হ'ল বেআইনী জেএসএন ডেটা। আইনি JSON ডেটা দিয়ে শুরু করা হয়েছে{[
এলিউইউ

1
গসনের সমস্যা হ'ল এটি শূন্যতা উপেক্ষা করে। JSON থেকে নিখোঁজ থাকলে কোনও valসম্পত্তি সহজেই হতে পারে null। এছাড়াও, ডিফল্ট মানগুলি মোটেই ব্যবহৃত হয় না।
ইউজার 3738870

21

আপনার যা প্রয়োজন এটি এটি নিশ্চিত কিনা তবে আমি এটি এটি করেছিলাম।

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
    }

এখানে জসনের একটি নমুনা রয়েছে:

{"খাবারগুলি": [{"ফুডনাম": "আপেল", "ওজন": "110"}]}


8
নির্ভরতা কী?
লুইস সোয়ারস

আমি org.json ব্যবহার করেছি। লিঙ্কটি এখানে: mvnrepository.com/artifact/org.json/json/20180813
মার্কবি

এই পদ্ধতিটির প্রয়োজন যে শ্রেণিতে কোনও প্যারাম ছাড়াই ডিফল্ট কনস্ট্রাক্টর থাকতে হবে। কি হবে যদি ডাটা বর্গ নিচের মত কন্সট্রাকটর মধ্যে প্যারাম আছে: data class SomeClass(val param1: Int, val param2: Int)
লেমনঘাও

@ লিমেঙ্গোও আপনি এটি এক লাইনে করতে পারেন: ভাল বিভাগ = সামারক্লাস (প্যারাম 1 = ফুডজসন.জেটএসএসওনজেক্ট (i) .get স্ট্রিং ("ফুডনাম"), প্যারাম 2 = ফুডজেসন.জেটজেএসএনওজেক্ট (i) .getInt ("ওজন"))
মার্কবি

সত্যিই ভাল কাজ করে। শুধু বলতে গেলে, আপনি এর for (i in 0 until foodJson!!.length()) {পরিবর্তে ব্যবহার করতে পারেন for (i in 0..foodJson!!.length() - 1) {। এটি একই কাজ করে এবং এটি আরও বেশি দৃশ্যমান হয়
আর্নিমিনার জেড

12

আমি ব্যক্তিগতভাবে জ্যাকসন মডিউলটি কোটলিনের জন্য ব্যবহার করতে পারি যা আপনি এখানে পেতে পারেন: জ্যাকসন -মডিউল-কোটলিন

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

উদাহরণস্বরূপ, নির্বাসন দক্ষতার পথের জেএসওনকে পার্স করার কোড এখানে রয়েছে যা বেশ ভারী (ফর্ম্যাট করার সময় ৮৪ ক লাইন):

কোটলিন কোড:

package util

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.*
import java.io.File

data class SkillTreeData( val characterData: Map<String, CharacterData>, val groups: Map<String, Group>, val root: Root,
                          val nodes: List<Node>, val extraImages: Map<String, ExtraImage>, val min_x: Double,
                          val min_y: Double, val max_x: Double, val max_y: Double,
                          val assets: Map<String, Map<String, String>>, val constants: Constants, val imageRoot: String,
                          val skillSprites: SkillSprites, val imageZoomLevels: List<Int> )


data class CharacterData( val base_str: Int, val base_dex: Int, val base_int: Int )

data class Group( val x: Double, val y: Double, val oo: Map<String, Boolean>?, val n: List<Int> )

data class Root( val g: Int, val o: Int, val oidx: Int, val sa: Int, val da: Int, val ia: Int, val out: List<Int> )

data class Node( val id: Int, val icon: String, val ks: Boolean, val not: Boolean, val dn: String, val m: Boolean,
                 val isJewelSocket: Boolean, val isMultipleChoice: Boolean, val isMultipleChoiceOption: Boolean,
                 val passivePointsGranted: Int, val flavourText: List<String>?, val ascendancyName: String?,
                 val isAscendancyStart: Boolean?, val reminderText: List<String>?, val spc: List<Int>, val sd: List<String>,
                 val g: Int, val o: Int, val oidx: Int, val sa: Int, val da: Int, val ia: Int, val out: List<Int> )

data class ExtraImage( val x: Double, val y: Double, val image: String )

data class Constants( val classes: Map<String, Int>, val characterAttributes: Map<String, Int>,
                      val PSSCentreInnerRadius: Int )

data class SubSpriteCoords( val x: Int, val y: Int, val w: Int, val h: Int )

data class Sprite( val filename: String, val coords: Map<String, SubSpriteCoords> )

data class SkillSprites( val normalActive: List<Sprite>, val notableActive: List<Sprite>,
                         val keystoneActive: List<Sprite>, val normalInactive: List<Sprite>,
                         val notableInactive: List<Sprite>, val keystoneInactive: List<Sprite>,
                         val mastery: List<Sprite> )

private fun convert( jsonFile: File ) {
    val mapper = jacksonObjectMapper()
    mapper.configure( DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true )

    val skillTreeData = mapper.readValue<SkillTreeData>( jsonFile )
    println("Conversion finished !")
}

fun main( args : Array<String> ) {
    val jsonFile: File = File( """rawSkilltree.json""" )
    convert( jsonFile )

জেএসএন (বিন্যাসিত নয়): http://filebin.ca/3B3reNQf3KXJ/rawSkilltree.json

আপনার বিবরণ দেওয়া, আমি বিশ্বাস করি এটি আপনার প্রয়োজনের সাথে মিলে যায়।


1
ক্ল্যাকসনের থেকে আলাদা (আমি চেষ্টা করার সময় এটি একটি বাগ ছিল), জ্যাকসন আসলে কাজ করে :)
redsk

অতিরিক্তভাবে, আপনার জন্য ডেটা ক্লাস তৈরি করতে আপনি JSON থেকে কোটলিন ডেটা ক্লাস প্লাগইন ব্যবহার করতে পারেন।
ব্রুকস ডুবুইস

7

JSON কে কোটলিন ব্যবহারে রূপান্তর করতে http://www.json2kotlin.com/ করুন

এছাড়াও আপনি অ্যান্ড্রয়েড স্টুডিও প্লাগইন ব্যবহার করতে পারেন। ফাইল> সেটিংস, Pluginsবাম গাছের মধ্যে নির্বাচন করুন , "রিপোজিটরিগুলি ব্রাউজ করুন ..." টিপুন, " জসনটোকোটলিনক্লাস " অনুসন্ধান করুন, এটি নির্বাচন করুন এবং সবুজ বোতাম "ইনস্টল করুন" ক্লিক করুন।

প্লাগ লাগানো

এএস পুনঃসূচনা করার পরে আপনি এটি ব্যবহার করতে পারেন। আপনি একটি ক্লাস তৈরি করতে পারেন File > New > JSON To Kotlin Class (JsonToKotlinClass)। অন্য উপায় হ'ল Alt + K টিপুন to

এখানে চিত্র বর্ণনা লিখুন

তারপরে আপনি JSON কে পেস্ট করার জন্য একটি ডায়ালগ দেখতে পাবেন।

2018 সালে আমাকে package com.my.package_nameক্লাসের শুরুতে যুক্ত করতে হয়েছিল।


4

সবার আগে।

আপনি POJO ক্লাসে (কোটলিন ডেটা ক্লাস) ম্যাপিংয়ের জন্য অ্যান্ড্রয়েড স্টুডিওতে JSON থেকে কোটলিন ডেটা ক্লাস রূপান্তরকারী প্লাগইন ব্যবহার করতে পারেন। এই প্লাগইনটি আপনার কোটলিন ডেটা ক্লাসটিকে জেএসএন অনুসারে টিকা দেবে।

তারপরে আপনি জেএসএনকে কোটলিনে রূপান্তর করতে GSON রূপান্তরকারী ব্যবহার করতে পারেন।

এই সম্পূর্ণ টিউটোরিয়ালটি অনুসরণ করুন: কোটলিন অ্যান্ড্রয়েড জেএসএন পার্সিং টিউটোরিয়াল

আপনি যদি ম্যানুয়ালি json পার্স করতে চান।

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 অ্যারের উপরে পার্স করতে কোড এবং সূচক 0 তে এর অবজেক্ট।

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

1

http://www.jsonschema2pojo.org/ হাই আপনি জসনকে পোজোতে রূপান্তর করতে এই ওয়েবসাইটটি ব্যবহার করতে পারেন।
কন্ট্রোল + Alt + Shift + K

এরপরে আপনি সেই মডেল শ্রেণিকে ম্যানুয়ালিটি কোটলিন মডেল শ্রেণিতে রূপান্তর করতে পারেন। উপরের শর্টকাটের সাহায্যে।


1
এটি জাভাতে রূপান্তরিত হবে।
কুলমাইন্ড

0

কিছুটা দেরি, তবে যাই হোক না কেন।

আপনি যদি জাভাস্ক্রিপ্টের জন্য JSON পার্স করতে পছন্দ করেন যেমন কোটলিন শব্দার্থবিজ্ঞানের ব্যবহার তৈরির জন্য, তবে আমি JSONKraken এর পরামর্শ দিচ্ছি , যার মধ্যে আমি লেখক।

বিষয়ে পরামর্শ এবং মতামত অনেক প্রশংসিত হয়!


-4

এখান থেকে ডেমের উত্স ডাউনলোড করুন ( অ্যান্ড্রয়েড কোটলিনে জেসন পার্সিং )

এই নির্ভরতা যুক্ত করুন:

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

এপিআই ফাংশন কল করুন:

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

        }

    })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.