Groovy - JSON



本章介绍如何使用 Groovy 语言解析和生成 JSON 对象。

JSON 函数

序号 函数与库
1

JsonSlurper

JsonSlurper 是一个类,它将 JSON 文本或读取器内容解析为 Groovy 数据

结构,例如映射、列表和诸如 Integer、Double、Boolean 和 String 之类的基本类型。

2

JsonOutput

此方法负责将 Groovy 对象序列化为 JSON 字符串。

使用 JsonSlurper 解析数据

JsonSlurper 是一个类,它将 JSON 文本或读取器内容解析为 Groovy 数据结构,例如映射、列表和诸如 Integer、Double、Boolean 和 String 之类的基本类型。

语法

def slurper = new JsonSlurper()

JSON slurper 将文本或读取器内容解析为列表和映射的数据结构。

JsonSlurper 类附带几种解析器实现变体。有时,在解析某些字符串时,您可能会有不同的要求。让我们以需要读取从 Web 服务器响应返回的 JSON 的情况为例。在这种情况下,使用解析器 JsonParserLax 变体是有益的。此解析器允许 JSON 文本中的注释以及无引号字符串等。要指定这种类型的解析器,在定义 JsonSlurper 对象时,需要使用 JsonParserType.LAX 解析器类型。

让我们看一个下面给出的示例。该示例用于使用 http 模块从 Web 服务器获取 JSON 数据。对于这种类型的遍历,最佳选择是将解析器类型设置为 JsonParserLax 变体。

http.request( GET, TEXT ) {
   headers.Accept = 'application/json'
   headers.'User-Agent' = USER_AGENT
	
   response.success = { 
      res, rd ->  
      def jsonText = rd.text 
		
      //Setting the parser type to JsonParserLax
      def parser = new JsonSlurper().setType(JsonParserType.LAX)
      def jsonResp = parser.parseText(jsonText)
   }
}

同样,Groovy 中还提供以下其他解析器类型:

  • JsonParserCharArray 解析器基本上获取 JSON 字符串并在底层字符数组上进行操作。在值转换期间,它会复制字符子数组(一种称为“分割”的机制)并在其上分别进行操作。

  • JsonFastParser 是 JsonParserCharArray 的一个特殊变体,也是最快的解析器。JsonFastParser 也被称为索引覆盖解析器。在给定 JSON 字符串的解析过程中,它会尽最大努力避免创建新的字符数组或 String 实例。它只保留指向底层原始字符数组的指针。此外,它尽可能延迟对象创建。

  • JsonParserUsingCharacterSource 是一个专为超大文件设计的特殊解析器。它使用一种称为“字符窗口”的技术来解析大型 JSON 文件(在这种情况下,大型文件是指大小超过 2MB 的文件),并具有恒定的性能特性。

解析文本

让我们来看一些如何使用 JsonSlurper 类的示例。

import groovy.json.JsonSlurper 

class Example {
   static void main(String[] args) {
      def jsonSlurper = new JsonSlurper()
      def object = jsonSlurper.parseText('{ "name": "John", "ID" : "1"}') 
		
      println(object.name);
      println(object.ID);
   } 
}

在上面的示例中,我们:

  • 首先创建一个 JsonSlurper 类的实例

  • 然后我们使用 JsonSlurper 类的 parseText 函数来解析一些 JSON 文本。

  • 当我们获取对象时,您可以看到我们实际上可以通过键访问 JSON 字符串中的值。

上面程序的输出如下:

John 
1

解析整数列表

让我们来看另一个 JsonSlurper 解析方法的示例。在下面的示例中,我们正在解析一个整数列表。您将从下面的代码中注意到,我们能够使用每个的 List 方法并向其传递一个闭包。

import groovy.json.JsonSlurper 
class Example {
   static void main(String[] args) {
      def jsonSlurper = new JsonSlurper()
      Object lst = jsonSlurper.parseText('{ "List": [2, 3, 4, 5] }')
      lst.each { println it }
   } 
}

上面程序的输出如下:

List=[2, 3, 4, 5]

解析基本数据类型的列表

JSON 解析器还支持字符串、数字、对象、true、false 和 null 的基本数据类型。JsonSlurper 类将这些 JSON 类型转换为相应的 Groovy 类型。

下面的示例演示如何使用 JsonSlurper 解析 JSON 字符串。在这里您可以看到 JsonSlurper 能够将各个项目解析为它们各自的基本类型。

import groovy.json.JsonSlurper 
class Example {

   static void main(String[] args) {
      def jsonSlurper = new JsonSlurper()
      def obj = jsonSlurper.parseText ''' {"Integer": 12, "fraction": 12.55, "double": 12e13}'''
		
      println(obj.Integer);
      println(obj.fraction);
      println(obj.double); 
   } 
}

上面程序的输出如下:

12 
12.55 
1.2E+14 

JsonOutput

现在让我们讨论如何以 Json 格式打印输出。这可以通过 JsonOutput 方法完成。此方法负责将 Groovy 对象序列化为 JSON 字符串。

语法

Static string JsonOutput.toJson(datatype obj)

参数 - 参数可以是数字、布尔值、字符、字符串、日期、映射、闭包等数据类型的对象。

返回类型 - 返回类型是 json 字符串。

示例

以下是实现此目的的简单示例。

import groovy.json.JsonOutput 
class Example {
   static void main(String[] args) {
      def output = JsonOutput.toJson([name: 'John', ID: 1])
      println(output);  
   }
}

上面程序的输出如下:

{"name":"John","ID":1}

JsonOutput 也可用于普通的 Groovy 对象。在下面的示例中,您可以看到我们实际上正在将 Student 类型的对象传递给 JsonOutput 方法。

import groovy.json.JsonOutput  
class Example {
   static void main(String[] args) {
      def output = JsonOutput.toJson([ new Student(name: 'John',ID:1),
         new Student(name: 'Mark',ID:2)])
      println(output);  
   } 
}
 
class Student {
   String name
   int ID; 
}

上面程序的输出如下:

[{"name":"John","ID":1},{"name":"Mark","ID":2}]
广告