Json解析简直是家常便饭,xml在android里面更是必不可少,但是在Groovy里面怎么解析这两种数据格式呢

一、JSON解析

需要用到的东西是:groovy.json.JsonSlurper

  • 解析字符串中的json内容
def str = '''{
	"groupId": "pub.fury.someapp.top",
	"version": "1.0.0",
	"artifactId": "somesdk",
	"array":[
		{
			"groupId": "pub.fury.someapp.1",
			"version": "1.0.1",
			"artifactId": "somesdk1",
		},
		{
			"groupId": "pub.fury.someapp.2",
			"version": "1.0.2",
			"artifactId": "somesdk2",
		},
		{
			"groupId": "pub.fury.someapp.3",
			"version": "1.0.3",
			"artifactId": "somesdk3",
		}
	]
}'''
// 解析json
def json = new groovy.json.JsonSlurper().parseText(str)
// 解析子节点元素值
assert json.groupId.equals("pub.fury.someapp.top")
assert json.version.equals("1.0.0")
// 解析数组元素
assert json.array[2].version.equals("1.0.3")
  • 解析其他来源的json,包括文件、byte数组、InputStream、甚至是网络接口中返回的json数据
public java.lang.Object parse(@NotNull byte[] bytes)

public java.lang.Object parse(@NotNull java.io.File file)

public java.lang.Object parse(@NotNull java.net.URL url)

public java.lang.Object parse(@NotNull java.net.URL url, java.util.Map params)

二、XML解析

需要用到的东西是:groovy.util.XmlSlurper,用法同上面的JsonSlurper

就拿最常见的AndroidManifest.xml来说

def xmlString = '''<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	android:versionCode="10"
	android:versionName="1.10"
	package="pub.fury.someapp">

	<uses-sdk android:minSdkVersion="9" />

	<application
		android:icon="@drawable/ic_launcher"
		android:label="demo"
		android:name="pub.fury.someapp.DemoApplication">
		<activity>
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER">Just for test</category>
			</intent-filter>
		</activity>
	</application>
</manifest>'''

// 解析xml
def xml = new groovy.util.XmlSlurper().parseText(xmlString)
// 以下标形式获取属性
assert xml['@android:versionCode'].equals("10")
// 以@形式获取属性
assert xml.@'android:versionCode'.equals("10")
// 获取子节点,同JsonSlurper,注意下面的'intent-filter'
def filter = xml.application.activity.'intent-filter'
// 获取节点中的文本
assert filter.category.text().equals("Just for test")