五纤虽、Groovy語(yǔ)法(五)json乳绕、xml解析

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解析

  1. 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]
  1. groovy創(chuàng)建xml數(shù)據(jù)
  • 手寫(xiě)創(chuàng)建
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>
'''

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锌钮,隨后出現(xiàn)的幾起案子桥温,更是在濱河造成了極大的恐慌,老刑警劉巖梁丘,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侵浸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氛谜,警方通過(guò)查閱死者的電腦和手機(jī)掏觉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)值漫,“玉大人澳腹,你說(shuō)我怎么就攤上這事⊙詈危” “怎么了酱塔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)危虱。 經(jīng)常有香客問(wèn)我羊娃,道長(zhǎng),這世上最難降的妖魔是什么埃跷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任蕊玷,我火速辦了婚禮,結(jié)果婚禮上弥雹,老公的妹妹穿的比我還像新娘垃帅。我一直安慰自己,他們只是感情好缅糟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布挺智。 她就那樣靜靜地躺著祷愉,像睡著了一般窗宦。 火紅的嫁衣襯著肌膚如雪赦颇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天赴涵,我揣著相機(jī)與錄音媒怯,去河邊找鬼。 笑死髓窜,一個(gè)胖子當(dāng)著我的面吹牛扇苞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寄纵,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鳖敷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了程拭?” 一聲冷哼從身側(cè)響起定踱,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恃鞋,沒(méi)想到半個(gè)月后崖媚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恤浪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年畅哑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片水由。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠呐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砂客,到底是詐尸還是另有隱情直秆,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布鞭盟,位于F島的核電站圾结,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏齿诉。R本人自食惡果不足惜筝野,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粤剧。 院中可真熱鬧歇竟,春花似錦、人聲如沸抵恋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧关。三九已至盅安,卻和暖如春唤锉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背别瞭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工窿祥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝙寨。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓晒衩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親墙歪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子听系,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • JSON JSON和XML都是需要解析的 JSON是一種輕量級(jí)的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,853評(píng)論 2 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,097評(píng)論 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5虹菲? 答:HTML5是最新的HTML標(biāo)準(zhǔn)跛锌。 注意:講述HT...
    kismetajun閱讀 27,474評(píng)論 1 45
  • 一. XML數(shù)據(jù)交換格式 XML數(shù)據(jù)交換格式是一種自描述的數(shù)據(jù)交互格式,雖然XML數(shù)據(jù)格式不如JSON "輕便"届惋,...
    __season____閱讀 2,502評(píng)論 0 7
  • 考拉海購(gòu)在過(guò)去一年中的版本更新記錄大致分為: 在最初的階段脑豹,滿足能買商品的情況下郑藏,優(yōu)先做了優(yōu)惠券,秒殺和把用戶...
    白熊S閱讀 1,639評(píng)論 0 14