Groovy數(shù)據(jù)解析
一、json解析
//groovy中也可導(dǎo)入gson逼纸、fastJson等json解析庫(kù)洋措,與java中一致
//但是groovy中提供了使用起來(lái)更加簡(jiǎn)潔的方式
class Person {
String name
Integer age
}
def personList = [new Person(name: 'java', age: 28), new Person(name: 'groovy', age: 6)]
//將對(duì)象解析成json字符串
def result = JsonOutput.toJson(personList)
println result //[{"age":28,"name":"java"},{"age":6,"name":"groovy"}]
println JsonOutput.prettyPrint(result) //格式化輸出
/**
[
{
"age": 28,
"name": "java"
},
{
"age": 6,
"namgovy"
}
]
*/
//將json字符串傳化為對(duì)象
def jsonSlurper = new JsonSlurper()
def objectResult = (ArrayList<Person>) jsonSlurper.parseText(result)
Person p = objectResult[0]
println "the name is $p.name,the age is $p.age" //輸出結(jié)果:the name is java,the age is 28
- 請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)并解析
def getNetWorkData(String url) {
//發(fā)送http請(qǐng)求(此處用原生的,也可導(dǎo)入okHttp庫(kù)進(jìn)行網(wǎng)絡(luò)操作)
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection()
connection.setConnectTimeout(10000)
connection.setRequestMethod('GET')
connection.connect()
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
StringBuffer stringBuffer = new StringBuffer()
String json = ""
while ((json = bufferedReader.readLine()) != null) {
stringBuffer.append(json)
}
String rsp = new String(stringBuffer.toString().getBytes(), "UTF-8")
//解析
def jsonSlurper = new JsonSlurper()
return jsonSlurper.parseText(rsp)
}
/*
{"data":[{"desc":"一起來(lái)做個(gè)App吧","id":10,"imagePath":"http://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png","isVisible":1,"order":2,"title":"一起來(lái)做個(gè)App吧","type":0,"url":"http://www.wanandroid.com/blog/show/2"},{"desc":"","id":4,"imagePath":"http://www.wanandroid.com/blogimgs/ab17e8f9-6b79-450b-8079-0f2287eb6f0f.png","isVisible":1,"order":0,"title":"看看別人的面經(jīng)杰刽,搞定面試~","type":1,"url":"http://www.wanandroid.com/article/list/0?cid=73"},{"desc":"","id":3,"imagePath":"http://www.wanandroid.com/blogimgs/fb0ea461-e00a-482b-814f-4faca5761427.png","isVisible":1,"order":1,"title":"兄弟菠发,要不要挑個(gè)項(xiàng)目學(xué)習(xí)下?","type":1,"url":"http://www.wanandroid.com/project"},{"desc":"","id":6,"imagePath":"http://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png","isVisible":1,"order":1,"title":"我們新增了一個(gè)常用導(dǎo)航Tab~","type":1,"url":"http://www.wanandroid.com/navi"},{"desc":"","id":2,"imagePath":"http://www.wanandroid.com/blogimgs/90cf8c40-9489-4f9d-8936-02c9ebae31f0.png","isVisible":1,"order":2,"title":"JSON工具","type":1,"url":"http://www.wanandroid.com/tools/bejson"},{"desc":"","id":5,"imagePath":"http://www.wanandroid.com/blogimgs/acc23063-1884-4925-bdf8-0b0364a7243e.png","isVisible":1,"order":3,"title":"微信文章合集","type":1,"url":"http://www.wanandroid.com/blog/show/6"}],"errorCode":0,"errorMsg":""}
*/
class Root {
List<Data> data
int errorCode
String errorMsg
class Data {
String desc
int id
String imagePath
int isVisible
int order
String title
int type
String url
}
}
Root root = getNetWorkData("http://www.wanandroid.com/banner/json")
println root.data[0].imagePath //輸出結(jié)果:http://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png
//以上是類似java的做法王滤,而在Groovy中,不需要寫(xiě)實(shí)體類滓鸠,可直接使用里面的字段
def response = getNetWorkData("http://www.wanandroid.com/banner/json")
println response.data[0].imagePath //輸出結(jié)果:http://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png
二雁乡、xml解析
- groovy解析xml數(shù)據(jù)
def xmlStr = '''
<response version-api="2.0">
<value>
<books id="1" classification="android">
<book available="20" id="1">
<title>Android組件化架構(gòu)</title>
<author id="1">蒼王</author>
</book>
<book available="14" id="2">
<title>Android 插件化開(kāi)發(fā)指南</title>
<author id="2">包建強(qiáng)</author>
</book>
<book available="13" id="3">
<title>Android開(kāi)發(fā)藝術(shù)探索</title>
<author id="3">任玉剛</author>
</book>
<book available="5" id="4">
<title>Android源碼設(shè)計(jì)模式2</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>
'''
//開(kāi)始解析
def xmlSlurper = new XmlSlurper()
def response = xmlSlurper.parseText(xmlStr) //解析出來(lái)的即為根節(jié)點(diǎn)
//輸出節(jié)點(diǎn)中對(duì)應(yīng)節(jié)點(diǎn)的值
println response.value.books[0].book[1].title.text() //Android 插件化開(kāi)發(fā)指南
//輸出節(jié)點(diǎn)中屬性的值,直接使用@
println response.value.books[0].book[1].@id //2
//遍歷
def list = []
response.value.books.each { books ->
//再對(duì)books中的book節(jié)點(diǎn)遍歷
books.book.each { book ->
def author = book.author.text()
if ('任玉剛' == author) {
list.add(book.title.text())
}
}
}
println list.toListString() // [Android開(kāi)發(fā)藝術(shù)探索]
//groovy提供了另外的遍歷xml方法
//深度遍歷
def list2 = []
response.depthFirst().findAll { book ->
if ('任玉剛' == book.author.text()){
list2.add(book.title.text())
return true
}
}
println list2.toListString() //[Android開(kāi)發(fā)藝術(shù)探索]
def titles = response.depthFirst().findAll { book ->
'任玉剛' == book.author.text()
}.collect { book->
book.title.text()
}
println titles.toListString() //[Android開(kāi)發(fā)藝術(shù)探索]
//廣度遍歷
def titles2 = response.value.books.children().findAll { node ->
('2'.compareTo((node.@id).toString())) < 0
}.collect { book ->
book.title.text()
}
println titles2 //[Android開(kāi)發(fā)藝術(shù)探索, Android源碼設(shè)計(jì)模式2]
- groovy創(chuàng)建xml數(shù)據(jù)
def sw = new StringWriter()
//用來(lái)生成xml
def xmlBuilder = new MarkupBuilder(sw)
//創(chuàng)建根節(jié)點(diǎn)response并且添加屬性version_api
xmlBuilder.response(version_api: '2.0') {
//在response中創(chuàng)建value節(jié)點(diǎn)
value() {
//在value中創(chuàng)建books節(jié)點(diǎn)
books(id: '1', classification: 'android') {
//在books節(jié)點(diǎn)中創(chuàng)建book節(jié)點(diǎn)
book(available: '20', id: '1') {
//創(chuàng)建title節(jié)點(diǎn)糜俗,(value為Android組件化架構(gòu)蔗怠,即title.text()的值)
title('Android組件化架構(gòu)') {}
//創(chuàng)建author節(jié)點(diǎn)
author(id: '1', '蒼王') {}
}
//第二個(gè)book節(jié)點(diǎn)
book(available: '14', id: '2') {
title('Android插件化開(kāi)發(fā)指南') {}
author(id: '2', '包建強(qiáng)') {}
}
//第三個(gè)book節(jié)點(diǎn)
book(available: '13', id: '3') {
title('Android開(kāi)發(fā)藝術(shù)探索') {}
author(id: '3', '任玉剛') {}
}
//第四個(gè)book節(jié)點(diǎn)
book(available: '5', id: '4') {
title('Android源碼設(shè)計(jì)模式2') {}
author(id: '4', '何紅輝') {}
}
}
//創(chuàng)建第二個(gè)books節(jié)點(diǎn)
books(id: '2', classification: 'web') {
//在books節(jié)點(diǎn)中創(chuàng)建book節(jié)點(diǎn)
book(available: '10', id: '1') {
//創(chuàng)建title節(jié)點(diǎn),(value為Android組件化架構(gòu)吩跋,即title.text()的值)
title('Vue從入門到精通') {}
//創(chuàng)建author節(jié)點(diǎn)
author(id: '4', '李剛') {}
}
}
}
}
println sw //輸出結(jié)果
'''
<response version_api="2.0">
<value>
<books id="1" classification="android">
<book available="20" id="1">
<title>Android組件化架構(gòu)</title>
<author id="1">蒼王</author>
</book>
<book available="14" id="2">
<title>Android 插件化開(kāi)發(fā)指南</title>
<author id="2">包建強(qiáng)</author>
</book>
<book available="13" id="3">
<title>Android開(kāi)發(fā)藝術(shù)探索</title>
<author id="3">任玉剛</author>
</book>
<book available="5" id="4">
<title>Android源碼設(shè)計(jì)模式2</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>
'''
- 根據(jù)服務(wù)器獲取對(duì)象數(shù)據(jù)創(chuàng)建
//模仿服務(wù)器中已有的數(shù)據(jù)
class Response {
String version_api
Value value
}
class Value {
def books = [new Books(id: '1', classification: 'android', book: [new Book(available: '20', id: '1', title: new Title(value: 'Android組件化架構(gòu)'), author: new Author(id: '1', value: '蒼王'))
, new Book(available: '14', id: '2', title: new Title(value: 'Android插件化開(kāi)發(fā)指南'), author: new Author(id: '2', value: '包建強(qiáng)'))
, new Book(available: '13', id: '3', title: new Title(value: 'Android開(kāi)發(fā)藝術(shù)探索'), author: new Author(id: '3', value: '任玉剛'))
, new Book(available: '5', id: '4', title: new Title(value: 'Android源碼設(shè)計(jì)模式2'), author: new Author(id: '4', value: '何紅輝'))]),
new Books(id: '2', classification: 'web', book: [new Book(available: '10', id: '1', title: new Title(value: 'Vue從入門到精通'), author: new Author(id: '4', value: '李剛'))])]
}
class Books {
String id
String classification
ArrayList<Book> book
}
class Book {
String available
String id
Title title
Author author
}
class Title {
def value
}
class Author {
def id
def value
}
def sw2 = new StringWriter()
//用來(lái)生成xml
def xmlBuilder2 = new MarkupBuilder(sw2)
//初始化數(shù)據(jù)寞射,假設(shè)是從服務(wù)器中獲取的數(shù)據(jù)
def response2 = new Response(version_api: '2.0', value: new Value())
xmlBuilder2.response(version_api: "$response2.version_api") {
value() {
response2.value.books.each { booksNode ->
//循環(huán)創(chuàng)建books節(jié)點(diǎn)
books(id: booksNode.id, classification: booksNode.classification) {
booksNode.book.each { bookNode ->
//循環(huán)創(chuàng)建book節(jié)點(diǎn)
book(available: bookNode.available, id: bookNode.id) {
title("$bookNode.title.value")
author(id: "$bookNode.author.id", "$bookNode.title.value")
}
}
}
}
}
}
println sw2 //輸出結(jié)果
'''
<response version_api='2.0'>
<value>
<books id='1' classification='android'>
<book available='20' id='1'>
<title>Android組件化架構(gòu)</title>
<author id='1'>Android組件化架構(gòu)</author>
</book>
<book available='14' id='2'>
<title>Android插件化開(kāi)發(fā)指南</title>
<author id='2'>Android插件化開(kāi)發(fā)指南</author>
</book>
<book available='13' id='3'>
<title>Android開(kāi)發(fā)藝術(shù)探索</title>
<author id='3'>Android開(kāi)發(fā)藝術(shù)探索</author>
</book>
<book available='5' id='4'>
<title>Android源碼設(shè)計(jì)模式2</title>
<author id='4'>Android源碼設(shè)計(jì)模式2</author>
</book>
</books>
<books id='2' classification='web'>
<book available='10' id='1'>
<title>Vue從入門到精通</title>
<author id='4'>Vue從入門到精通</author>
</book>
</books>
</value>
</response>
'''