• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

172
Views
Kotlinx.Serializer: crea un JSON rápido para enviar

He estado jugando con Kotlinx.serialisation. He estado tratando de encontrar una manera rápida de usar Kotlinx.serialisation para crear un JSON simple y simple (principalmente para enviarlo), con un desorden de código mínimo.

Para una cadena simple como:

 {"Album": "Foxtrot", "Year": 1972}

que he estado haciendo es algo como:

 val str:String = Json.stringify(mapOf( "Album" to JsonPrimitive("Foxtrot"), "Year" to JsonPrimitive(1972)))

Lo cual está lejos de ser agradable. Mis elementos son en su mayoría primitivos, así que desearía tener algo como:

 val str:String = Json.stringify(mapOf( "Album" to "Sergeant Pepper", "Year" to 1967))

Además, me encantaría tener una solución con un JSON anidado. Algo como:

 Json.stringify(JsonObject("Movies", JsonArray( JsonObject("Name" to "Johnny English 3", "Rate" to 8), JsonObject("Name" to "Grease", "Rate" to 1))))

Eso produciría:

 { "Movies": [ { "Name":"Johnny English 3", "Rate":8 }, { "Name":"Grease", "Rate":1 } ] }

(no necesariamente embellecido, mejor aún no)

¿Hay algo por el estilo?

Nota : es importante usar un serializador y no una cadena directa como

 """{"Name":$name, "Val": $year}"""

porque no es seguro concatenar cadenas. ¡Cualquier char ilegal podría desintegrar el JSON! No quiero lidiar con escapes de personajes ilegales :-(

Gracias

almost 3 years ago · Santiago Trujillo
1 answers
Answer question

0

¿Este conjunto de métodos de extensión le brinda lo que desea?

 @ImplicitReflectionSerializer fun Map<*, *>.toJson() = Json.stringify(toJsonObject()) @ImplicitReflectionSerializer fun Map<*, *>.toJsonObject(): JsonObject = JsonObject(map { it.key.toString() to it.value.toJsonElement() }.toMap()) @ImplicitReflectionSerializer fun Any?.toJsonElement(): JsonElement = when (this) { null -> JsonNull is Number -> JsonPrimitive(this) is String -> JsonPrimitive(this) is Boolean -> JsonPrimitive(this) is Map<*, *> -> this.toJsonObject() is Iterable<*> -> JsonArray(this.map { it.toJsonElement() }) is Array<*> -> JsonArray(this.map { it.toJsonElement() }) else -> JsonPrimitive(this.toString()) // Or throw some "unsupported" exception? }

Esto le permite pasar un Map con varios tipos de claves/valores y obtener una representación JSON de él. En el mapa, cada valor puede ser un primitivo (cadena, número o booleano), nulo, otro mapa (que representa un nodo secundario en JSON) o una matriz o colección de cualquiera de los anteriores.

Puedes llamarlo de la siguiente manera:

 val json = mapOf( "Album" to "Sergeant Pepper", "Year" to 1967, "TestNullValue" to null, "Musicians" to mapOf( "John" to arrayOf("Guitar", "Vocals"), "Paul" to arrayOf("Bass", "Guitar", "Vocals"), "George" to arrayOf("Guitar", "Sitar", "Vocals"), "Ringo" to arrayOf("Drums") ) ).toJson()

Esto devuelve el siguiente JSON, no embellecido, como querías:

 {"Album":"Sergeant Pepper","Year":1967,"TestNullValue":null,"Musicians":{"John":["Guitar","Vocals"],"Paul":["Bass","Guitar","Vocals"],"George":["Guitar","Sitar","Vocals"],"Ringo":["Drums"]}}

Probablemente también desee agregar manejo para algunos otros tipos, por ejemplo, fechas.

Pero, ¿puedo simplemente verificar que desea compilar JSON manualmente en código de esta manera en lugar de crear clases de datos para todas sus estructuras JSON y serializarlas de esa manera? Creo que generalmente es la forma más estándar de manejar este tipo de cosas. Aunque tal vez su caso de uso no lo permita.

También vale la pena señalar que el código tiene que usar la anotación ImplicitReflectionSerializer , ya que usa la reflexión para averiguar qué serializador usar para cada bit. Esta es todavía una funcionalidad experimental que podría cambiar en el futuro.

almost 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error