Kotlin में YAML के साथ काम करना: लाइब्रेरीज़ और उपयोग के उदाहरण
YAML (YAML Ain't Markup Language) डेटा सीरियलाइज़ेशन का एक सुविधाजनक फ़ॉर्मेट है, जिसका उपयोग अक्सर कॉन्फ़िगरेशन फ़ाइलों, API स्पेसिफिकेशन (OpenAPI) और डेटा एक्सचेंज के लिए किया जाता है। Kotlin इकोसिस्टम में YAML के साथ काम करने के लिए कई परिपक्व लाइब्रेरीज़ मौजूद हैं, जिनमें से प्रत्येक की अपनी विशेषताएँ हैं। इस लेख में हम तीन मुख्य दृष्टिकोणों पर विचार करेंगे: SnakeYAML, kaml और kotlinx.serialization का YAML फ़ॉर्मेट के साथ उपयोग।
1. SnakeYAML — JVM के लिए क्लासिक पार्सर
SnakeYAML YAML के साथ काम करने के लिए सबसे लोकप्रिय Java लाइब्रेरी है, जो Kotlin के साथ पूरी तरह से संगत है। यह YAML दस्तावेज़ों को पार्स करने और बनाने के लिए लो-लेवल API प्रदान करता है।
कनेक्शन (डिपेंडेंसी जोड़ना)
build.gradle.kts में डिपेंडेंसी जोड़ें:
implementation("org.yaml:snakeyaml:2.2")
उदाहरण: YAML पढ़ना
config.yaml फ़ाइल पर विचार करें:
server:
host: localhost
port: 8080
database:
url: jdbc:postgresql://localhost/mydb
user: admin
password: secret
पार्सिंग के लिए कोड:
import org.yaml.snakeyaml.Yaml
import java.io.File
fun main() {
val yaml = Yaml()
val inputStream = File("config.yaml").inputStream()
val data: Map<String, Any> = yaml.load(inputStream)
val server = data["server"] as Map<String, Any>
println("होस्ट: ${server["host"]}")
println("पोर्ट: ${server["port"]}")
val db = data["database"] as Map<String, Any>
println("DB URL: ${db["url"]}")
}
उदाहरण: YAML बनाना
fun createYaml() {
val data = mapOf(
"appName" to "MyApp",
"version" to "1.0.0",
"features" to listOf("auth", "logging", "metrics")
)
val yaml = Yaml()
val writer = FileWriter("output.yaml")
yaml.dump(data, writer)
writer.close()
}
SnakeYAML के फायदे:
- Java प्रोजेक्ट्स के साथ अधिकतम संगतता
- YAML 1.1 की सभी सुविधाओं का समर्थन (एंकर, टैग, कस्टम टाइप)
DumperOptionsके माध्यम से लचीला कॉन्फ़िगरेशन
नुकसान:
- रॉ टाइप
Map<String, Any>के साथ काम करता है — टाइप कास्टिंग आवश्यक है - Kotlin के data-क्लासेज़ को "आउट ऑफ़ द बॉक्स" सपोर्ट नहीं करता
2. kaml — Kotlin के लिए data-क्लास सपोर्ट वाली लाइब्रेरी
kaml SnakeYAML के ऊपर एक रैपर है, जो Kotlin के data-क्लासेज़ में डिसीरियलाइज़ेशन और उनसे सीरियलाइज़ेशन का समर्थन जोड़ता है। यह लाइब्रेरी ऑटोमैटिक मैपिंग के लिए Kotlin रिफ्लेक्शन का उपयोग करती है।
कनेक्शन (डिपेंडेंसी जोड़ना)
implementation("net.mamoe.yamlkt:yamlkt:0.13.0")
उदाहरण: data-क्लास में डिसीरियलाइज़ेशन
import net.mamoe.yamlkt.Yaml
import net.mamoe.yamlkt.YamlElement
data class ServerConfig(
val host: String,
val port: Int
)
data class AppConfig(
val server: ServerConfig,
val debug: Boolean = false
)
fun main() {
val yaml = Yaml()
val input = """
server:
host: "0.0.0.0"
port: 8080
debug: true
""".trimIndent()
val config = yaml.decodeFromString(AppConfig.serializer(), input)
println("सर्वर: ${config.server.host}:${config.server.port}")
println("डीबग मोड: ${config.debug}")
}
उदाहरण: सीरियलाइज़ेशन
fun serializeConfig() {
val config = AppConfig(
server = ServerConfig("localhost", 9090),
debug = false
)
val yaml = Yaml()
val output = yaml.encodeToString(AppConfig.serializer(), config)
println(output)
}
kaml के फायदे:
- टाइप-सेफ्टी — Kotlin के data-क्लासेज़ के साथ काम करता है
- डिफ़ॉल्ट वैल्यू का समर्थन (
debug: false) - सरल API जो
kotlinx.serializationका उपयोग करता है
नुकसान:
- SnakeYAML की तुलना में थोड़ा धीमा (रिफ्लेक्शन के कारण)
- YAML 1.2 की कुछ उन्नत सुविधाओं का समर्थन नहीं करता