Groovy 類和JSON之間的相互轉換,主要在groovy.json包下面html
JsonSlurper 這個類用於轉換JSON文本或從Groovy 數據結構中讀取內容例如map、list和一些基本的數據類型如Integer, Double, Boolean和String. java
這個類有一系列重載的Parse的方法和一些指定特殊的方法,例如parseText,parseFile..
下一個離職咱們將以parseText使用爲例,將JSON 字符串轉換爲list 和map對象。其餘parse開頭的方法與之相似只是參數不一樣而已,ios
import groovy.json.JsonSlurper express
class ParseJson_01 { json
static main(args) { 數據結構
def jsonSlurper = new JsonSlurper() app
def object = jsonSlurper.parseText('{ "name": "John Doe" } ') ide
assert object instanceof Map ui
assert object.name == 'John Doe' this
}
}
JsonSlurper除了maps支持,JSON 數據轉被換成lists。
import groovy.json.JsonSlurper
class ParseJson_02 {
static main(args) {
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "myList": [4, 8, 15, 16, 23, 42] }')
assert object instanceof Map
assert object.myList instanceof List
assert object.myList == [4, 8, 15, 16, 23, 42]
}
}
JSON支持一下的的標準的原始數據類型:string 、number、object、true、false和null. JsonSlurper把這些解析成相應的Groovy類型.
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText '''
{ "simple": 123,
"fraction": 123.66,
"exponential": 123e12
}'''
assert object instanceof Map
assert object.simple.class == Integer
assert object.fraction.class == BigDecimal
As JsonSlurper is returning pure Groovy object instances without any special JSON classes in the back, its usage is transparent. In fact, JsonSlurper results conform to GPath expressions. GPath is a powerful expression language that is supported by multiple slurpers for different data formats (XmlSlurper for XML being one example).
For more details please have a look at the section on GPath expressions. |
Json
和groovy 對應的數據類型
JSON |
Groovy |
string |
java.lang.String |
number |
java.lang.BigDecimal or java.lang.Integer |
object |
java.util.LinkedHashMap |
array |
java.util.ArrayList |
true |
true |
false |
false |
null |
null |
date |
java.util.Date based on the yyyy-MM-dd'T'HH:mm:ssZ date format |
Whenever a value in JSON is null, JsonSlurper supplements it with the Groovy null value. This is in contrast to other JSON parsers that represent a null value with a library-provided singleton object. |
JsonSlurper comes with a couple of parser implementations. Each parser fits different requirements, it could well be that for certain scenarios the JsonSlurper default parser is not the best bet for all situations. Here is an overview of the shipped parser implementations:
The default parser implementation for JsonSlurper is JsonParserCharArray. The JsonParserType enumeration contains constants for the parser implementations described above:
Implementation |
Constant |
JsonParserCharArray |
JsonParserType#CHAR_BUFFER |
JsonFastParser |
JsonParserType#INDEX_OVERLAY |
JsonParserLax |
JsonParserType#LAX |
JsonParserUsingCharacterSource |
JsonParserType#CHARACTER_SOURCE |
Changing the parser implementation is as easy as setting the JsonParserType with a call to JsonSlurper#setType().
def jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY)
def object = jsonSlurper.parseText('{ "myList": [4, 8, 15, 16, 23, 42] }')
assert object instanceof Map
assert object.myList instanceof List
assert object.myList == [4, 8, 15, 16, 23, 42]
JsonOutput is responsible for serialising Groovy objects into JSON strings. It can be seen as companion object to JsonSlurper, being a JSON parser.
JsonOutput comes with overloaded, static toJson methods. Each toJson implementation takes a different parameter type. The static method can either be used directly or by importing the methods with a static import statement.
The result of a toJson call is a String containing the JSON code.
def json = JsonOutput.toJson([name: 'John Doe', age: 42])
assert json == '{"name":"John Doe","age":42}'
JsonOutput does not only support primitive, maps or list data types to be serialized to JSON, it goes further and even has support for serialising POGOs, that is, plain-old Groovy objects.
class Person { String name }
def json = JsonOutput.toJson([ new Person(name: 'John'), new Person(name: 'Max') ])
assert json == '[{"name":"John"},{"name":"Max"}]'
As we saw in previous examples, the JSON output is not pretty printed per default. However, the prettyPrint method in JsonSlurper comes to rescue for this task.
def json = JsonOutput.toJson([name: 'John Doe', age: 42])
assert json == '{"name":"John Doe","age":42}'
assert JsonOutput.prettyPrint(json) == '''\
{
"name": "John Doe",
"age": 42
}'''.stripIndent()
prettyPrint takes a String as single parameter. It must not be used in conjunction with the other JsonOutput methods, it can be applied on arbitrary JSON String instances.
Another way to create JSON from Groovy is to use the JsonBuilder or StreamingJsonBuilder. Both builders provide a DSL which allows to formulate an object graph which is then converted to JSON at some point.
For more details on builders, have a look at the builders chapter which covers both JSON builders in great depth. |