Groovy - JSON

  • 简述

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

    序号 Function & Libraries
    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 期间,它会尽可能地避免创建新的 char 数组或 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}]