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}]
廣告