Try it yourself with our free Xml Formatter tool — runs entirely in your browser, no signup needed.

How to Convert XML to JSON in Kotlin

How to convert XML to JSON in Kotlin

Converting XML to JSON is a common task in software development, especially when working with APIs or data exchange between systems. Kotlin, being a modern and concise language, provides an efficient way to achieve this conversion. In this guide, we will explore how to convert XML to JSON in Kotlin, covering the basics, handling edge cases, and providing performance tips.

Quick Example

import org.json.JSONObject
import org.json.XML

fun xmlToJson(xmlString: String): String {
    val jsonObject = XML.toJSONObject(xmlString)
    return jsonObject.toString()
}

// Example usage:
val xmlString = "<person><name>John</name><age>30</age></person>"
val jsonString = xmlToJson(xmlString)
println(jsonString) // Output: {"person":{"name":"John","age":30}}

This example uses the org.json library, which can be added to your project by including the following dependency in your build.gradle file:

dependencies {
    implementation 'org.json:json:20210308'
}

Step-by-Step Breakdown

Let's break down the xmlToJson function:

  1. import org.json.JSONObject and import org.json.XML: We import the necessary classes from the org.json library.
  2. fun xmlToJson(xmlString: String): String: We define a function xmlToJson that takes an XML string as input and returns a JSON string.
  3. val jsonObject = XML.toJSONObject(xmlString): We use the XML.toJSONObject method to convert the XML string to a JSONObject. This method parses the XML string and creates a corresponding JSON object.
  4. return jsonObject.toString(): We convert the JSONObject to a JSON string using the toString method and return it.

Handling Edge Cases

Empty/null input

If the input XML string is empty or null, the XML.toJSONObject method will throw a JSONException. We can handle this by adding a null check and returning an empty JSON object:

fun xmlToJson(xmlString: String?): String {
    if (xmlString == null || xmlString.isEmpty()) {
        return "{}"
    }
    val jsonObject = XML.toJSONObject(xmlString)
    return jsonObject.toString()
}

Invalid input

If the input XML string is invalid, the XML.toJSONObject method will throw a JSONException. We can handle this by catching the exception and returning an error message:

fun xmlToJson(xmlString: String): String {
    try {
        val jsonObject = XML.toJSONObject(xmlString)
        return jsonObject.toString()
    } catch (e: JSONException) {
        return "{\"error\":\"Invalid XML\"}"
    }
}

Large input

When dealing with large XML files, it's essential to consider performance. We can improve performance by using a streaming XML parser like XmlPullParser. However, for simplicity, we'll stick with the XML.toJSONObject method. To handle large input, we can increase the JVM's memory allocation or use a more efficient parsing library.

// Increase JVM memory allocation
java -Xmx1024m -jar your-app.jar

Unicode/special characters

The org.json library handles Unicode characters correctly. However, if you encounter issues with special characters, you can use the JSONObject.quote method to escape them:

fun xmlToJson(xmlString: String): String {
    val jsonObject = XML.toJSONObject(xmlString)
    val jsonString = jsonObject.toString()
    return JSONObject.quote(jsonString)
}

Common Mistakes

1. Forgetting to handle null input

// Wrong
fun xmlToJson(xmlString: String): String {
    val jsonObject = XML.toJSONObject(xmlString)
    return jsonObject.toString()
}

// Corrected
fun xmlToJson(xmlString: String?): String {
    if (xmlString == null || xmlString.isEmpty()) {
        return "{}"
    }
    val jsonObject = XML.toJSONObject(xmlString)
    return jsonObject.toString()
}

2. Not handling invalid input

// Wrong
fun xmlToJson(xmlString: String): String {
    val jsonObject = XML.toJSONObject(xmlString)
    return jsonObject.toString()
}

// Corrected
fun xmlToJson(xmlString: String): String {
    try {
        val jsonObject = XML.toJSONObject(xmlString)
        return jsonObject.toString()
    } catch (e: JSONException) {
        return "{\"error\":\"Invalid XML\"}"
    }
}

3. Not considering performance for large input

// Wrong
fun xmlToJson(xmlString: String): String {
    val jsonObject = XML.toJSONObject(xmlString)
    return jsonObject.toString()
}

// Corrected
fun xmlToJson(xmlString: String): String {
    // Use a streaming XML parser or increase JVM memory allocation
    // ...
}

Performance Tips

1. Use a streaming XML parser

For large XML files, consider using a streaming XML parser like XmlPullParser to improve performance.

import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserFactory

fun xmlToJson(xmlString: String): String {
    val factory = XmlPullParserFactory.newInstance()
    val parser = factory.newPullParser()
    parser.setInput(xmlString)
    // Parse the XML and create a JSONObject
    // ...
}

2. Increase JVM memory allocation

For large XML files, increase the JVM's memory allocation to prevent OutOfMemoryError.

java -Xmx1024m -jar your-app.jar

3. Use a more efficient parsing library

Consider using a more efficient parsing library like Jackson or Gson for better performance.

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.dataformat.xml.XmlMapper

fun xmlToJson(xmlString: String): String {
    val mapper = XmlMapper()
    val jsonNode = mapper.readTree(xmlString)
    return jsonNode.toString()
}

FAQ

Q: What is the best way to handle invalid XML input?

A: Catch the JSONException and return an error message or handle it according to your application's requirements.

Q: How can I improve performance for large XML files?

A: Use a streaming XML parser, increase JVM memory allocation, or use a more efficient parsing library.

Q: Can I use this approach for JSON to XML conversion?

A: Yes, you can use the JSONObject and XML classes to convert JSON to XML.

Q: What is the difference between XML.toJSONObject and XmlPullParser?

A: XML.toJSONObject is a simple and convenient method for parsing XML, while XmlPullParser is a more efficient and flexible streaming parser.

Q: Can I use this approach for parsing HTML documents?

A: No, this approach is designed for parsing XML documents. For parsing HTML documents, consider using a dedicated HTML parsing library like Jsoup.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp