groovy 速学 - 23 - Xml及 Json 的处理

目录

摘要

MarkupBuilder,StreamingMarkupBuilder,XmlParser,XmlSlurper,JsonBuilder

Xml 及 Json 的处理

Xml 的处理

创建 Xml
MarkupBuilder
def sw = new StringWriter()
def xml = new MarkupBuilder(sw)
xml.langs(type: "current") {
  language("Java")
  language("Groovy")
  language("JavaScript")
}

生成结果

<langs type='current'>
  <language>Java</language>
  <language>Groovy</language>
  <language>JavaScript</language>
</langs>
StreamingMarkupBuilder

比 MarkupBuilder 更强大,支持 CDATA,命名空间等的创建
并且只有当 bind() 被调用时,xml 才会被创建,所以可以先在多个线程中构建 xml 的结构。

def comment = "<![CDATA[<!-- address is new to this release -->]]>"
builder = new StreamingMarkupBuilder()
builder.encoding = "UTF-8"
def person = {
  mkp.xmlDeclaration()
  mkp.pi("xml-stylesheet": "type='text/xsl' href='myfile.xslt'")
  mkp.declareNamespace('': 'http://myDefaultNamespace')
  mkp.declareNamespace('location': 'http://someOtherNamespace')
  person(id: 100) {
    firstname("Jane")
    lastname("Doe")
    mkp.yieldUnescaped(comment)
    location.address("123 Main")
  }
}
def writer = new FileWriter("person.xml")
writer << builder.bind(person)

生成结果

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type='text/xsl' href='myfile.xslt'?>
<person id='100' xmlns='http://myDefaultNamespace' xmlns:location='http://someOtherNamespace'>
    <firstname>Jane</firstname>
    <lastname>Doe</lastname><![CDATA[<!-- address is new to this release -->]]>
    <location:address>123 Main</location:address>
</person>
解析 Xml
XmlParser

从文件中解析

def langs = new XmlParser().parse("langs.xml")
println "type = ${langs.attribute("type")}"         //type = current
langs.language.each {
  println it.text()
}

从字符串中解析

def 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>
"""
langs = new XmlParser().parseText(xml)
println langs.attribute("count")
langs.language.each {
  println it.text()
}
XmlSlurper

更为强大,支持类似 XPATH 的语法

def langs = new XmlSlurper().parseText(xml)
println langs.@count
langs.language.each {
  println it
}
println langs.language[1].@flavor               //dynamic

Json 的处理

创建 Json

只含有 JsonObject

def json = new JsonBuilder()
json.call {
    results {
        result("x")
        result("y")
    }
}
println(json.toPrettyString())
  • 输出
{
    "results": {
        "result": "y"
    }
}

含有 JsonArray

def list = [
        [code: "111", value: "222"],
        [code: "333", value: "444"]
]
def builder = new JsonBuilder(list)
println builder.toPrettyString()
  • 输出
[
    {
        "code": "111",
        "value": "222"
    },
    {
        "code": "333",
        "value": "444"
    }
]

混合 JsonObject 和 JsonArray

def root = new JsonBuilder()
root {
    data(
            list.collect {
                [
                        code : it.code,
                        value: it.value
                ]
            }
    )
}
println root.toPrettyString()
  • 输出
{
    "data": [
        {
            "code": "111",
            "value": "222"
        },
        {
            "code": "333",
            "value": "444"
        }
    ]
}
解析 Json
def json = """
{
    "data": [
        {
            "code": "111",
            "value": "222"
        },
        {
            "code": "333",
            "value": "444"
        }
    ]
}
"""
def data = new JsonSlurper().parseText(json)
println data.data[0].code           //111
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值