Apache Groovy - A powerful multi-faceted programming language for the JVM platform with comprehensive module support
—
Groovy provides comprehensive JSON support through JsonSlurper for parsing and JsonBuilder for generation, with multiple parser types and flexible configuration options.
Primary class for parsing JSON from various sources with configurable parser types.
class JsonSlurper {
JsonSlurper()
// Core parsing methods
Object parseText(String text)
Object parse(File file)
Object parse(File file, String charset)
Object parse(InputStream inputStream)
Object parse(InputStream inputStream, String charset)
Object parse(URL url)
Object parse(URL url, String charset)
Object parse(Reader reader)
Object parse(char[] chars)
Object parse(byte[] bytes)
Object parse(byte[] bytes, String charset)
Object parse(Path path)
Object parse(Path path, String charset)
// URL parsing with parameters
Object parse(URL url, Map params)
Object parse(Map params, URL url)
Object parse(URL url, Map params, String charset)
Object parse(Map params, URL url, String charset)
// Configuration methods
JsonSlurper setType(JsonParserType type)
JsonParserType getType()
int getMaxSizeForInMemory()
JsonSlurper setMaxSizeForInMemory(int maxSizeForInMemory)
boolean isChop()
JsonSlurper setChop(boolean chop)
boolean isLazyChop()
JsonSlurper setLazyChop(boolean lazyChop)
boolean isCheckDates()
JsonSlurper setCheckDates(boolean checkDates)
}Enumeration of available JSON parser implementations.
enum JsonParserType {
CHAR_BUFFER, // Default parser type
CHARACTER_SOURCE,
INDEX_OVERLAY,
LAX
}Usage examples:
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
// Parse JSON string
def jsonText = '{"name": "John", "age": 30, "city": "New York"}'
def result = jsonSlurper.parseText(jsonText)
assert result.name == 'John'
assert result.age == 30
// Parse JSON from file
def file = new File('data.json')
def data = jsonSlurper.parse(file)
// Parse JSON from URL
def url = new URL('https://api.example.com/data.json')
def apiData = jsonSlurper.parse(url)
// Use different parser types
def laxSlurper = new JsonSlurper().setType(JsonParserType.LAX)
def relaxedJson = laxSlurper.parseText('{name: "John", age: 30}') // Unquoted keys allowed
// Configure parser settings
def configuredSlurper = new JsonSlurper()
.setType(JsonParserType.LAX)
.setMaxSizeForInMemory(1000000)
.setChop(true)
.setCheckDates(false)
// Parse with URL parameters
def params = [timeout: 5000, maxRetries: 3]
def apiData = jsonSlurper.parse(url, params)Builder for constructing JSON data structures programmatically.
class JsonBuilder implements Writable {
JsonBuilder()
JsonBuilder(Object content)
Object call()
Object call(Closure c)
Object call(Object... args)
Object call(Iterable coll, Closure c)
Object call(Object[] array, Closure c)
Object call(Map m)
Object call(Map m, Closure c)
Object call(List l)
Object call(List l, Closure c)
String toString()
String toPrettyString()
Writer writeTo(Writer out)
Object getContent()
}Usage examples:
import groovy.json.JsonBuilder
// Simple object construction
def builder = new JsonBuilder()
builder {
name 'John'
age 30
city 'New York'
hobbies(['reading', 'swimming'])
}
println builder.toPrettyString()
// Array of objects
builder = new JsonBuilder()
builder([
[name: 'John', age: 30],
[name: 'Jane', age: 25]
])
// Nested structures
builder = new JsonBuilder()
builder {
user {
name 'John'
details {
age 30
address {
street '123 Main St'
city 'New York'
}
}
}
}
// Dynamic content with closures
def users = [
[name: 'John', age: 30],
[name: 'Jane', age: 25]
]
builder = new JsonBuilder(users) { person ->
name person.name
age person.age
adult person.age >= 18
}Memory-efficient JSON builder for large data structures using streaming output.
class StreamingJsonBuilder implements Writable {
StreamingJsonBuilder(Writer writer)
StreamingJsonBuilder(Writer writer, JsonGenerator generator)
Object call(Closure c)
Object call(Object... args)
Object call(Iterable coll, Closure c)
Object call(Object[] array, Closure c)
Object call(Map m)
Object call(Map m, Closure c)
Object call(List l)
Object call(List l, Closure c)
Writer writeTo(Writer out)
Writer getWriter()
}Usage example:
import groovy.json.StreamingJsonBuilder
def writer = new StringWriter()
def builder = new StreamingJsonBuilder(writer)
builder {
users([
[name: 'John', age: 30],
[name: 'Jane', age: 25]
]) { user ->
name user.name
age user.age
adult user.age >= 18
}
}
println writer.toString()Utility class for JSON serialization and formatting.
class JsonOutput {
static String toJson(Object object)
static String prettyPrint(String jsonPayload)
static void prettyPrint(String jsonPayload, Writer writer)
static String toJson(Map m)
static String toJson(Collection c)
static String toJson(Object[] array)
static String toJson(boolean b)
static String toJson(Number n)
static String toJson(Character c)
static String toJson(String s)
static String toJson(Date date)
static String toJson(Calendar cal)
static String toJson(UUID uuid)
static String toJson(URL url)
static String toJson(Closure closure)
}Usage examples:
import groovy.json.JsonOutput
// Convert objects to JSON
def person = [name: 'John', age: 30, hobbies: ['reading', 'swimming']]
def json = JsonOutput.toJson(person)
println json // {"name":"John","age":30,"hobbies":["reading","swimming"]}
// Pretty print JSON
def prettyJson = JsonOutput.prettyPrint(json)
println prettyJson
// Convert various types
assert JsonOutput.toJson([1, 2, 3]) == '[1,2,3]'
assert JsonOutput.toJson(true) == 'true'
assert JsonOutput.toJson(null) == 'null'
assert JsonOutput.toJson('hello') == '"hello"'Configurable JSON generator for customizing serialization behavior.
class JsonGenerator {
static interface Converter {
boolean handles(Class<?> type)
Object convert(Object value, String key)
}
static class Options {
Options addConverter(Converter converter)
Options excludeNulls()
Options excludeFieldsByName(String... fieldNames)
Options excludeFieldsByType(Class... types)
Options dateFormat(String format)
Options dateFormat(String format, Locale locale)
Options timezone(String timezone)
Options disableUnicodeEscaping()
}
static Options options()
String toJson(Object object)
String toJson(Object object, Options options)
}Usage example:
import groovy.json.JsonGenerator
def generator = new JsonGenerator.Options()
.excludeNulls()
.dateFormat('yyyy-MM-dd')
.build()
def person = [
name: 'John',
age: 30,
birthDate: new Date(),
spouse: null // Will be excluded due to excludeNulls()
]
def json = generator.toJson(person)
println jsonCommon JSON processing exceptions and error patterns:
import groovy.json.JsonException
import groovy.json.JsonSlurper
try {
def slurper = new JsonSlurper()
def result = slurper.parseText('{"invalid": json}') // Invalid JSON
} catch (JsonException e) {
println "JSON parsing error: ${e.message}"
}
// Handle missing properties gracefully
def json = '{"name": "John"}'
def slurper = new JsonSlurper()
def person = slurper.parseText(json)
def age = person.age ?: 0 // Default to 0 if age is missingimport groovy.json.JsonBuilder
import groovy.transform.ToString
@ToString
class Person {
String name
int age
Date birthDate
// Custom JSON representation
def toJsonMap() {
[
name: name,
age: age,
birthYear: birthDate.year + 1900
]
}
}
def person = new Person(name: 'John', age: 30, birthDate: new Date())
def builder = new JsonBuilder(person.toJsonMap())
println builder.toPrettyString()import groovy.json.JsonSlurper
import groovy.json.StreamingJsonBuilder
// Parse large JSON file efficiently
def slurper = new JsonSlurper()
new File('large-data.json').withInputStream { stream ->
def data = slurper.parse(stream)
// Process data in chunks
data.records.each { record ->
// Process individual records
processRecord(record)
}
}
// Generate large JSON files efficiently
new File('output.json').withWriter { writer ->
def builder = new StreamingJsonBuilder(writer)
builder {
records(largeDataSet) { record ->
id record.id
name record.name
// Include only necessary fields
}
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-codehaus-groovy--groovy-all