Analysieren Sie JSON-String zu Objekt in Kotlin

David Mbochi Njonge 30 Januar 2023
  1. Erstellen Sie ein neues Projekt und fügen Sie Abhängigkeiten hinzu
  2. Analysieren Sie den JSON-String in ein Objekt in Kotlin mit der Bibliothek kotlinx.serialization
  3. Analysieren Sie JSON-String zu Objekt in Kotlin mit der Bibliothek org.json
  4. Analysieren Sie die JSON-Zeichenfolge in ein Objekt in Kotlin mithilfe der Gson-Bibliothek
  5. Analysieren Sie die JSON-Zeichenfolge in ein Objekt in Kotlin mithilfe der Jackson-Bibliothek
  6. Fazit
Analysieren Sie JSON-String zu Objekt in Kotlin

JSON steht für JavaScript Object Notation, ein Datenaustauschformat, das von Client-Server-Architekturen verwendet wird, um Daten zwischen Computern zu übertragen oder Daten in einer Datenbank zu speichern.

Die JSON-Daten werden mithilfe von REST-APIs verbraucht, die HTTP-Anforderungen an die Server ausgeben, um CRUD-Vorgänge für die in der Datenbank gespeicherten Daten auszuführen. Wenn wir beispielsweise Daten dynamisch auf eine Webseite oder eine mobile Anwendung laden, rufen wir diese Daten normalerweise als JSON aus der Datenbank ab, parsen die Daten in Objekte und zeigen jede Objektvariable in der Ansicht an.

In diesem Tutorial lernen wir die verschiedenen Methoden kennen, mit denen wir JSON-Daten in Kotlin-Objekte parsen können.

Erstellen Sie ein neues Projekt und fügen Sie Abhängigkeiten hinzu

Um ein neues Projekt zu erstellen, gehen Sie zu Intellij und wählen Sie Datei > Neu > Projekt. Geben Sie im sich öffnenden Fenster als Projektnamen kotlinSerialization ein, wählen Sie im Abschnitt Sprache Kotlin und im Abschnitt Build System Gradle aus.

Drücken Sie die Schaltfläche Create, um ein neues Projekt zu erstellen. Sobald das Projekt generiert ist, gehen Sie zur Datei build.gradle.kts und stellen Sie sicher, dass Sie die folgenden Abhängigkeiten haben.

dependencies {
    implementation ("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3")
    implementation ("com.google.code.gson:gson:2.9.0")
    implementation("org.json:json:20220320")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3")
    testImplementation(kotlin("test"))
}

Jede Abhängigkeit stellt APIs bereit, die wir verwenden, um jede Implementierung zu erstellen. Stellen Sie also sicher, dass Sie über alle Abhängigkeiten verfügen, um nicht aufgelöste Referenzfehler zu vermeiden.

Analysieren Sie den JSON-String in ein Objekt in Kotlin mit der Bibliothek kotlinx.serialization

In diesem Beispiel müssen wir sicherstellen, dass wir die folgenden Plugins im Abschnitt Plugins der Datei build.gradle.kts haben.

plugins {
    kotlin("jvm") version "1.7.0"
    kotlin("plugin.serialization") version "1.7.0"
}

Erstellen Sie die Ordnerstruktur com/serialize unter dem Ordner kotlin des Projekts, in dem unsere Kotlin-Dateien erstellt werden.

Erstellen Sie eine Datei mit dem Namen UsingKotlinx.kt im Ordner serialize und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.

package com.serialize

import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

val employeeJSON = """
    {
       "firstName": "john",
       "lastName": "doe",
       "email": "john@gmail.com"
    }
""".trimIndent()

@Serializable
data class Employee(val firstName: String,
                    val lastName: String,
                    val email: String)

fun main(args: Array<String>){
    //Decode employee from string
    val employeeObject = Json.decodeFromString<Employee>(employeeJSON);
    println(employeeObject);
}

Im obigen Code haben wir einen mehrzeiligen Text unseres JSON-Objekts erstellt, indem wir Kotlins Text in dreifachen Anführungszeichen verwendet haben, um unser Mitarbeiterobjekt darzustellen. Die Methode trimIndent() entfernt einen gemeinsamen Einzug aller Eingabezeilen und entfernt die erste und letzte Zeile, falls sie leer sind.

Anschließend haben wir eine Klasse Employee erstellt und diese mit der Annotation @Serializable versehen. Die Klasse Employee ist eine Datenklasse mit den Parametern firstName, lastName und email.

Diese Parameter speichern unsere Daten, daher das Schlüsselwort data. Wenn wir eine Datenklasse verwenden, erhalten wir einige Methoden wie toString() aus der Box, ohne sie zu deklarieren, und dies ist entscheidend, wenn Sie die Daten in der Konsole protokollieren möchten.

Die Annotation @Serializable macht die Klasse Employee serialisierbar, was bedeutet, dass wir sie in ein Format ändern können, das in einer Datenbank oder einer Datei gespeichert oder über das Netzwerk übertragen werden kann.

Um unser JSON-Objekt in ein Kotlin-Objekt zu parsen, rufen wir die generische Methode decodeFromString() von Json auf. Da wir ein Mitarbeiterobjekt zurückgeben wollen, übergeben wir die Klasse Employee an den Typparameter und unseren JSON-String als Argument der Methode.

Die Anweisung print protokolliert das geparste Objekt auf der Konsole. Führen Sie den Code aus und beachten Sie, dass das Objekt als Zeichenfolge in der Konsole protokolliert wird, wie unten gezeigt.

Employee(firstName=john, lastName=doe, email=john@gmail.com)

Analysieren Sie JSON-String zu Objekt in Kotlin mit der Bibliothek org.json

In diesem Beispiel verwenden wir die JSONObject-API, die von der org.json-Bibliothek bereitgestellt wird. Beachten Sie, dass diese Bibliothek beim Hinzufügen der Abhängigkeiten in unsere Anwendung aufgenommen wurde.

Erstellen Sie eine Datei mit dem Namen UsingJSONObject.kt im Ordner serialize und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.

package com.serialize

import org.json.JSONObject

val usersArray = """
    {
       "User":[
          {
            "firstName": "john",
            "lastName": "doe",
            "email": "john@gmail.com"
          },
          {
            "firstName": "mary",
            "lastName": "public",
            "email": "mary@gmail.com"
          }

       ]
    }
""".trimIndent()

class User{
    var firstName: String? = null;
    var lastName: String? = null;
    var email: String? = null

    override fun toString(): String {
        return "User(firstName=$firstName, lastName=$lastName, email=$email)"
    }

}

fun main() {
    val userJsonObject =
        JSONObject(usersArray)

    val userObject = userJsonObject
        .getJSONArray("User");

    for (i in 0 until(userObject!!.length())){
        val theUser = User();

        val firstName = userObject
            .getJSONObject(i)
            .getString("firstName");
        theUser.firstName = firstName

        val lastName = userObject
            .getJSONObject(i)
            .getString("lastName")
        theUser.lastName = lastName

        val email = userObject
            .getJSONObject(i)
            .getString("email")

        theUser.email = email;

        println(theUser);
    }

}

Der erste und der zweite Schritt ähneln denen, die wir im vorherigen Beispiel behandelt haben, aber diese Klasse erstellt ein Array von JSON-Objekten und verwendet eine normale Kotlin-Klasse. Da wir in diesem Beispiel keine Datenklasse verwenden, müssen wir unsere benutzerdefinierte toString()-Methode mit den Feldern firstName, lastName und email erstellen.

Um das JSON-Array abzurufen, rufen wir den Konstruktor JSONObject() auf und übergeben den JSON-String als Argument des Konstruktors. Der Konstruktor erstellt ein JSON-Objekt aus einer Zeichenfolge, die mit { beginnt und mit } endet; Es löst eine JSONException aus, wenn der String einen Fehler enthält.

Der Zugriff auf das JSON-Objekt ermöglicht es uns, jede gewünschte Eigenschaft abzurufen, indem wir diese Eigenschaft als Argument übergeben. Um das Array von Benutzern abzurufen, rufen wir die Methode getJSONArray() aus dem zurückgegebenen Objekt auf und übergeben User als Argument der Methode.

Die Methode gibt ein JSONArray von Benutzern aus dem Objekt zurück.

Das Erstellen von Kotlin-Objekten aus dem JSONArray erfolgt manuell über eine Schleife. Wir rufen jedes Objekt aus dem Array mit der Methode getJSONObject() ab, indem wir den Index des Objekts als Argument der Methode übergeben.

Von diesem Objekt rufen wir jede Variable ab und weisen sie einem neuen Kotlin-Objekt zu, das für jede Iteration erstellt wird. Führen Sie die Anwendung aus, um zu überprüfen, ob sie die folgenden Zeichenfolgenobjekte ausgibt.

User(firstName=john, lastName=doe, email=john@gmail.com)
User(firstName=mary, lastName=public, email=mary@gmail.com)

Analysieren Sie die JSON-Zeichenfolge in ein Objekt in Kotlin mithilfe der Gson-Bibliothek

Erstellen Sie eine UsingGson.kt-Datei im Ordner serialize und kopieren Sie den folgenden Code in die Datei.

package com.serialize

import com.google.gson.Gson

val customerObject = """
    {
       "firstName": "john",
       "lastName": "doe",
       "email": "john@gmail.com"
    }
""".trimIndent()

class Customer{
    private val firstName: String? = null;
    private val lastName: String? = null;
    private val email: String? = null;

    override fun toString(): String {
        return "Customer(firstName=$firstName, lastName=$lastName, email=$email)"
    }

}

fun main() {
    val theGson = Gson();
    val customer = theGson
        .fromJson(customerObject, Customer::class.java);
    println(customer);
}

Wir sind sicher, dass Sie verstanden haben, dass im ersten Schritt eine JSON-Darstellung unseres Objekts erstellt wird und im zweiten Schritt eine Klasse erstellt wird, die zum Erstellen eines Kotlin-Objekts aus der Zeichenfolge verwendet wird.

Die Hauptmethode ruft den Konstruktor Gson() auf, um ein Gson-Objekt mit der Standardkonfiguration zu erstellen.

Um unseren JSON-String einem Kotlin-Objekt zuzuordnen, rufen Sie die Methode fromJson() aus dem Gson-Objekt auf und übergeben Sie den JSON-String als erstes Argument der Methode und class als zweiten Parameter der Methode.

Beachten Sie, dass die Methode fromJson() generisch ist und den Objekttyp zurückgibt, der als zweites Argument der Methode übergeben wird. Die Methode wird auch überladen, um andere Implementierungen bereitzustellen, z. B. das Lesen des JSON-Objekts aus einer Datei.

Führen Sie das Programm aus und beachten Sie, dass es das folgende Zeichenfolgenobjekt in der Konsole protokolliert.

Customer(firstName=john, lastName=doe, email=john@gmail.com)

Analysieren Sie die JSON-Zeichenfolge in ein Objekt in Kotlin mithilfe der Jackson-Bibliothek

Erstellen Sie eine Datei mit dem Namen UsingJackson.kt im Ordner serialize und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.

package com.serialize

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

val vehicleObject = """
    {
      "vehicleName": "Toyota",
      "vehicleColor": "white",
      "vehiclePrice": 10000
    }
""".trimIndent()

data class Vehicle(private val vehicleName: String,
                   private val vehicleColor: String,
                   private val vehiclePrice: Int)

fun main() {
    val jacksonMapper = jacksonObjectMapper();

    val vehicle = jacksonMapper
        .readValue(vehicleObject, Vehicle::class.java)

    println(vehicle);
}

In diesem Code haben wir eine Zeichenfolge erstellt, die unser JSON-Objekt darstellt, und eine Klasse, die verwendet wird, um die Zeichenfolge einem Kotlin-Objekt zuzuordnen. Die in der Klasse erstellten Eigenschaften müssen mit den Schlüsseln in der JSON-Zeichenfolge identisch sein.

Um die Jackson-Bibliothek zu verwenden, rufen wir den jacksonObjectMapper() in der Hauptmethode auf, um einen ObjectMapper zu erstellen. Dann rufen wir die readValue()-Methode des ObjectMapper auf und übergeben den JSON-String als erstes Argument und die class, die gemappt wird, als zweites Argument.

Die Methode readValue() deserialisiert den JSON-String und gibt den Objekttyp zurück, der als zweites Argument der Methode übergeben wird.

Führen Sie den Code aus, um zu überprüfen, ob das folgende Objekt als Zeichenfolge in der Konsole protokolliert wird.

Vehicle(vehicleName=Toyota, vehicleColor=white, vehiclePrice=10000)

Fazit

In diesem Tutorial haben wir gelernt, wie man ein JSON-Objekt in ein Kotlin-Objekt parst. Zu den Ansätzen, die wir behandelt haben, gehören: Verwenden der Bibliothek kotlix.serialization, der Bibliothek org.json, der Bibliothek Gson und der Bibliothek Jackson.

Beachten Sie, dass dies nicht die einzigen Bibliotheken sind, die wir verwenden können, um dasselbe Ziel zu erreichen. Sie können Ihre Anwendung also gerne mit anderen Bibliotheken implementieren.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub