使用groovy自帶的json工具進行json操做java
groovy.json.JsonSlurper:將json原數據轉成實體對象 groovy.json.JsonOutput:將實體對象轉成json數據node
def list = [
new Person(name: 'John', age: 25),
new Person(name: 'Major', age: 26)
]
// 對象轉json
def json = JsonOutput.toJson(list)
println json // 一行輸出json字符串
println JsonOutput.prettyPrint(json) // 以json格式輸出json字符串
// json轉對象
def jsonSlurper = new JsonSlurper()
jsonSlurper.parse(obj) // jsonSlurper.parseText(str)
複製代碼
groovy是徹底兼容java的,因此java能使用的第三方json庫(如:gson、fastjson),在groovy中也一樣能夠導入使用,但通常不建議這麼作,groovy自己提供的工具箱就已經知足平常開發需求了。android
下面是groovy將網絡json數據轉成實體對象,並訪問對應屬性字段的例子:web
def response = getNetworkData("http://xxx/data.json")
println response.data.name // 不須要定義具體的實體類,就能夠直接訪問對應的屬性字段
def getNetworkData(String url){
// 發送http請求
def connection = new URL(url).openConnection()
connection.setRequestMethod('GET')
connection.connect() // 該方法會阻塞線程
def response = connection.content.text
// 將json轉化爲實體對象
def jsonSluper = new JsonSlurper()
return jsonSluper.parseText(response)
}
複製代碼
java xml處理:DOM文檔驅動處理方式、SAX事件驅動處理方式。 groovy則爲咱們提供了xml工具箱:json
groovy.xml.XmlSlurper:將xml原數據轉成實體對象 groovy.xml.MarkupBuilder:將實體對象轉成xml數據設計模式
final String xml = ''' <response version-api="2.0"> <value> <books id="1" classification="android"> <book available="20" id="1"> <title>瘋狂Android講義</title> <author id="1">李剛</author> </book> <book available="14" id="2"> <title>第一行代碼</title> <author id="2">郭林</author> </book> <book available="13" id="3"> <title>Android開發藝術探索</title> <author id="3">任玉剛</author> </book> <book available="5" id="4"> <title>Android源碼設計模式</title> <author id="4">何紅輝</author> </book> </books> <books id="2" classification="web"> <book available="10" id="1"> <title>Vue從入門到精通</title> <author id="4">李剛</author> </book> </books> </value> </response> '''
def xmlSlurper = new XmlSlurper()
def response = xmlSlurper.parseText(xml) // 讀取並解析xml數據
println response.value.books[0].book[0].title.text() // 獲取標籤內容
println response.value.books[0].book[0].@available // 獲取標籤屬性
// 獲取全部做者是"李剛"的書籍名稱
// 方法一:平行遍歷xml數據
def list = []
response.value.books.each { books ->
books.book.each { book ->
def author = book.author.text()
if(author.equals('李剛')){
list.add(book.title.text())
}
}
}
println list.toListString()
// 方法二:深度遍歷xml數據
// response.depthFirst().findAll 至關於 response.'**'.findAll
def titles = response.depthFirst().findAll { book ->
return book.author.text() == '李剛' ? true : false
}
// 獲取id爲2的book節點的title內容
// 廣度遍歷xml數據
// response.value.books.children().findAll 至關於 response.value.books.'*'.findAll
def names = response.value.books.children().findAll { node ->
node.name() == 'book' && node.@id == '2'
}.collect { node ->
return node.title.text()
}
複製代碼
李剛
20
[瘋狂Android講義, Vue從入門到精通]
複製代碼
其餘:api
/** * 生成xml格式數據 * <langs type='current' count='3' mainstream='true'> * <language flavor='static' version='1.5'>java</language> * <language flavor='dynamic' version='1.6.0'>Groovy</language> * <language flavor='dynamic' version='1.9'>JavaScript</language> * </langs> */
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw) // 用來生成xml數據的核心類
// 使用僞方法建立 根結點langs,在參數括號中指定標籤屬性key-value
xmlBuilder.langs(type: 'current', count: '3', mainstream: 'true'){
// 一樣,使用僞方法建立 language結點,不指定key時,該value將做爲標籤內容
language(flavor: 'static', version: '1.5', 'Java')
language(flavor: 'dynamic', version: '1.6.0', 'Groovy')
language(flavor: 'dynamic', version: '1.9', 'JavaScript')
}
println sw
複製代碼
上面是使用MarkupBuilder直接編寫輸出xml數據,但實際開發中,每每是將實體對象轉成xml,在明白MarkupBuilder的用法以後,這樣的需求處理也是差很少的:網絡
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
def langs = new Langs()
xmlBuilder.langs(type: langs.type, count: langs.count, mainstream: langs.mainstream) {
langs.languages.each { lang->
language (flavor: lang.flavor, version: lang.version, lang.value)
}
}
class Langs{
String type = 'current'
String count = '3'
String mainstream = 'true'
def Languages = [
new Language(flavor: 'static', version: '1.5', value: 'java'),
new Language(flavor: 'dynamic', version: '1.6.0', value: 'Groovy')
new Language(flavor: 'dynamic', version: '1.9', value: 'JavaScript')
]
}
class Language{
String flavor
String version
String value
}
...
複製代碼
java文件處理:節點流(InputStream、OutputSteam及其子類)、處理流(Reader、Writer及其子類) groovy文件處理:全部java對文件的處理類,groovy均可以使用;groovy擴展了許多更加快捷和強大的方法(ResourceGroovyMethods)。app
def file = new File('../../GroovySpecification.iml')
file.eachLine { line -> // 遍歷文件中的每一行
println line
}
def text = file.getText() // 返回文件中全部行內容的文本
def result = file.readLines() // 返回一個一行行文本內容的List
def readerBuffer = file.withReader { reader -> // 讀取文件中前100個字符
char[] buffer = new char[100]
reader.read(buffer)
return buffer
}
// copy文件
def copy(String srcPath, String destPath) {
try{
// 建立目標文件
def destFile = new File(destPath)
if(!destFile.exists()){
destFile.createNewFile()
}
// 開始拷貝
new File(srcPath).withReader{ reader ->
def lines = reader.readLines()
destFile.withWriter{ writer ->
lines.each{ line ->
writer.append(line+"\r\n")
}
}
}
}catch(Exception e){
e.printStackTrace()
}
}
// 對象保存到文件
def saveObject(Object object, String path){
try{
// 建立目標文件
def destFile = new File(path)
if(!destFile.exists()){
destFile.createNewFile()
}
destFile.withObjectOutputStream { out ->
out.writeObject(object)
}
}catch(Exception e){
e.printStackTrace()
}
}
// 從文件讀取對象
def readObject(String path){
def obj = null
try{
def file = new File(path)
if(file == null || !file.exists()) return null
// 從文件中讀取對象
file.withObjectInputStream{ input ->
obj = input.readObject()
}
}catch(Exception e){
e.printStackTrace()
}
return obj
}
複製代碼