Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

220
Vistas
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

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda