Serialization
JSON, TOML, YAML, XML and Properties serialization
                
                Document not reviewed yet, might be outdated. Please,
                let us know
                if you find something invalid here.
                
            
            
            
                
                To access this functionality you can include the:
                
            
        com.soywiz.korge:korge-core:5.1.0
                artifact from maven central.
                
                
                All the functionality yields in the
                
                korlibs.serialization package
                
                .
                
            
            
            On this page
            
            
                
            
        
        KorIO has utilities for serializing and deserializing typical formats.
JSON
object Json {
    fun parse(s: String): Any?
    fun parse(s: StrReader): Any?
    fun stringify(obj: Any?, pretty: Boolean = false): String
    fun stringify(obj: Any?, b: StringBuilder)
    fun stringifyPretty(obj: Any?, b: Indenter)
    interface CustomSerializer {
        fun encodeToJson(b: StringBuilder)
    }
}
fun String.fromJson(): Any? = Json.parse(this)
fun Map<*, *>.toJson(pretty: Boolean = false): String = Json.stringify(this, pretty)
TOML
object TOML {
    fun parseToml(str: String, out: MutableMap<String, Any?> = LinkedHashMap()): Map<String, Any?>
}
YAML
object Yaml {
    fun decode(str: String): Any?
    fun read(str: String): Any?
    // Pseudo-internal API
    fun StrReader.tokenize(): List<Token>
    interface Token {
        data class LINE(val str: String, val level: Int) : Token
        data class ID(val str: String) : Token
        data class STR(val str: String, val ustr: String) : Token
        data class SYMBOL(val str: String) : Token
    }
}
XML
XML parser comes in two flavors.
The streaming API:
object Xml.Stream {
    fun parse(str: String): Iterable<Xml.Element>
    fun parse(r: StrReader): Iterable<Xml.Element>
}
sealed class Xml.Element {
    class ProcessingInstructionTag(val name: String, val attributes: Map<String, String>) : Xml.Element()
    class OpenCloseTag(val name: String, val attributes: Map<String, String>) : Xml.Element()
    class OpenTag(val name: String, val attributes: Map<String, String>) : Xml.Element()
    class CommentTag(val text: String) : Xml.Element()
    class CloseTag(val name: String) : Xml.Element()
    class Text(val text: String) : Xml.Element()
}
The SimpleXML-like API:
// Creating a new Xml from Data
fun Xml(str: String): Xml
fun String.toXml(): Xml
suspend fun VfsFile.readXml(): Xml
// Encoding and decoding Xml entities
object Xml.Entities {
    fun encode(str: String): String
    fun decode(str: String): String
    fun decode(r: StrReader): String
}
class Xml {
    companion object {
        // To create nodes
        fun Tag(tagName: String, attributes: Map<String, Any?>, children: List<Xml>): Xml
        fun Text(text: String): Xml
        fun Comment(text: String): Xml
        fun parse(str: String): Xml
    }
    enum class Type { NODE, TEXT, COMMENT }
    // Node Type Information
    val type: Type
    val isText: Boolean
    val isComment: Boolean
    val isNode: Boolean
    val name: String
    val nameLC: String
    val attributes: Map<String, String>
    val attributesLC: Map<String, T>
    val descendants: Iterable<Xml>
    val allChildren: List<Xml>
    val allChildrenNoComments: List<Xml>
    val allNodeChildren: List<Xml>
    val content: String
    val text: String
    val attributesStr: String
    val outerXml: String
    val innerXml: String
    fun toOuterXmlIndented(indenter: Indenter = Indenter()): Indenter
    fun childText(name: String): String?
    // Children access
    operator fun get(name: String): Iterable<Xml>
    fun children(name: String): Iterable<Xml>
    fun child(name: String): Xml?
    // Attribute reading
    fun hasAttribute(key: String): Boolean
    fun attribute(name: String): String?
    fun getString(name: String): String?
    fun getInt(name: String): Int?
    fun getLong(name: String): Long?
    fun getDouble(name: String): Double?
    fun getFloat(name: String): Float?
    fun double(name: String, defaultValue: Double = 0.0): Double
    fun float(name: String, defaultValue: Float = 0f): Float
    fun int(name: String, defaultValue: Int = 0): Int
    fun long(name: String, defaultValue: Long = 0): Long
    fun str(name: String, defaultValue: String = ""): String
    fun doubleNull(name: String): Double?
    fun floatNull(name: String): Float?
    fun intNull(name: String): Int?
    fun longNull(name: String): Long?
    fun strNull(name: String): String?
    override fun toString(): String = outerXml
}
fun Iterable<Xml>.str(name: String, defaultValue: String = ""): String
fun Iterable<Xml>.children(name: String): Iterable<Xml>
val Iterable<Xml>.allChildren: Iterable<Xml>
val Iterable<Xml>.allNodeChildren: Iterable<Xml>
val Iterable<Xml>.firstText: String?
val Iterable<Xml>.text: String
operator fun Iterable<Xml>.get(name: String): Iterable<Xml>
Properties
class Props(private val props: LinkedHashMap<String, String> = LinkedHashMap<String, String>()) : MutableMap<String, String> by props {
	companion object {
		fun load(str: String): Props
	}
	fun deserializeAdd(str: String)
	fun deserializeNew(str: String)
	fun serialize(): String
}
suspend fun VfsFile.loadProperties(charset: Charset = UTF8): Props
suspend fun VfsFile.saveProperties(props: Props, charset: Charset = UTF8)