JsonSlurper如何正确解析内嵌原始JSON字符串的JSON数据?
问题场景
在CI/CD工具中实现Postman集合自动化运行时,JsonSlurper无法正常解析内部包含原始JSON字符串的JSON数据。
复现问题的示例代码:
import groovy.json.JsonSlurper def data = ''' { "request":{ "raw": "{\n \"Hello\": \"World\"\n}" } } ''' def parser = new JsonSlurper() jsonData = parser.parseText(data) println(jsonData)
运行代码抛出如下异常:
Caught: groovy.json.JsonException: expecting '}' or ',' but got current char ''' with an int value of 39 The current character read is ''' with an int value of 39 expecting '}' or ',' but got current char ''' with an int value of 39 line number 3 index number 7 'request':{ ....^ groovy.json.JsonException: expecting '}' or ',' but got current char ''' with an int value of 39 The current character read is ''' with an int value of 39 expecting '}' or ',' but got current char ''' with an int value of 39 line number 3 index number 7 'request':{ ....^ at main.run(main.groovy:12)
目标是让JsonSlurper将raw字段的取值作为普通字符串处理。
报错根因
该问题和JsonSlurper的解析逻辑无关,是硬编码JSON字符串时的转义处理错误导致的:
Groovy的三单引号'''定义的字符串中,仅单引号转义符\'会被识别,其余场景下反斜杠会被当做普通字符保留。代码中写的\"最终传入JSON解析器时会变成未转义的双引号,直接破坏外层JSON的语法结构。解析器读到raw字段内部的双引号时,会误认为raw的字符串值已经结束,后续字符不符合JSON语法规则,因此抛出异常。
解决方案
根据使用场景选择对应处理方式即可:
- 场景1:需要在Groovy代码中硬编码嵌套JSON的字符串
改用三双引号"""定义字符串,同时对嵌套JSON内部的转义符做二次转义,保证传入解析器的JSON结构合法。修改后的可运行代码如下:import groovy.json.JsonSlurper def data = """ { "request":{ "raw": "{\\n \\"Hello\\": \\"World\\"\\n}" } } """ def parser = new JsonSlurper() jsonData = parser.parseText(data) // 此时raw字段会被识别为普通字符串 println(jsonData.request.raw) // 输出: { "Hello": "World" } // 如果需要解析raw内部的JSON,单独调用一次解析方法即可 def rawJson = parser.parseText(jsonData.request.raw) println(rawJson.Hello) // 输出: World - 场景2:从外部文件/接口读取Postman集合JSON(CI/CD场景的通用情况)
这类场景不需要额外做转义处理。只要读取的源文件是Postman导出的合法JSON文件,文件本身的转义格式符合规范,JsonSlurper会自动将raw字段识别为字符串类型,不会尝试解析其内部的JSON结构。如果后续需要使用raw字段内的JSON内容,单独对该字段值调用一次parseText解析即可。
内容的提问来源于stack exchange,提问作者Joseph Woolf
相关产品推荐
相关产品推荐

