跳到主要内容

json

json 库提供 JSON 的序列化/反序列化与路径查询能力,并能从混杂文本中智能提取 JSON 片段,是数据处理与接口测试的常用工具。

典型使用场景:

  • 序列化:json.dumps(对象转字符串,可配 json.withIndent / json.noEscapeHTML)、json.Marshaljson.loads 解析字符串。
  • 路径查询:json.Find / json.FindPath(JSONPath 取值)、json.ReplaceAll(按路径替换)。
  • 提取:json.ExtractJSON / json.ExtractJSONEx 从任意文本里捞出合法 JSON 片段。

与相邻库的关系:json 是纯数据处理库,常与 http/poc(解析接口响应)、jsonstream(流式大 JSON)、jsonschema(结构定义)配合。

共 12 个函数

函数索引

函数参数返回值说明
json.ExtractJSONraw string[]string从一段文本中提取并修复其中包含的所有 JSON 字符串(导出名为 json.ExtractJSON)
json.ExtractJSONExraw string[]string, []string从一段文本中提取所有 JSON 字符串,同时返回修复后与修复前的版本(导出名为 json.ExtractJSONEx)
json.Findjson any, jsonPath stringany使用 JSONPath 查找并返回 JSON 中匹配的所有值(导出名为 json.Find)
json.FindPathjson any, jsonPath stringany使用 JSONPath 查找并返回 JSON 中匹配的第一个值(导出名为 json.FindPath)
json.Marshalv any[]byte, error将一个对象序列化为 JSON 字节(导出名为 json.Marshal)
json.Newi any*yakJson, error根据传入的值创建一个 JSON 对象(导出名为 json.New)
json.ReplaceAlljson any, jsonPath string, replaceValue anyany使用 JSONPath 替换 JSON 中所有匹配的值,返回替换后的对象(导出名为 json.ReplaceAll)
json.noEscapeHTML-JsonOpt设置 json.dumps 时不转义 HTML 字符(导出名为 json.noEscapeHTML)
json.withIndentindent stringJsonOpt设置 json.dumps 输出时的缩进字符串(导出名为 json.withIndent)
json.withPrefixprefix stringJsonOpt设置 json.dumps 输出时每一行的前缀(导出名为 json.withPrefix)

可变参数函数索引

函数参数返回值说明
json.dumpsraw any, opts ...JsonOptstring将一个对象转换为 JSON 字符串,返回转换后的字符串
json.loadsraw any, opts ...JsonOptany将一个 JSON 字符串转换为对象,返回转换后的对象,通常是一个omap

函数详情

ExtractJSON

ExtractJSON(raw string) []string

从一段文本中提取并修复其中包含的所有 JSON 字符串(导出名为 json.ExtractJSON)

常用于从 AI 回复、日志等夹杂自然语言的文本中抽取 JSON 片段

参数

参数名类型说明
rawstring包含 JSON 片段的原始文本

返回值

序号类型说明
r1[]string提取并修复后的 JSON 字符串切片

示例

v = json.ExtractJSON(`prefix {"a": "b"} mid {"c": "d"} end`)
println(len(v)) // OUT: 2
assert len(v) == 2, "ExtractJSON should extract two JSON fragments"

ExtractJSONEx

ExtractJSONEx(raw string) (results []string, rawStr []string)

从一段文本中提取所有 JSON 字符串,同时返回修复后与修复前的版本(导出名为 json.ExtractJSONEx)

相比 ExtractJSON,额外返回修复前的原始片段,便于对照

参数

参数名类型说明
rawstring包含 JSON 片段的原始文本

返回值

序号类型说明
results[]string修复后的 JSON 字符串切片
rawStr[]string修复前的原始 JSON 字符串切片(无需修复时可能为空)

示例

fixed, raws = json.ExtractJSONEx(`see {"a": "b"}`)
println(len(fixed)) // OUT: 1
assert len(fixed) == 1, "ExtractJSONEx should extract one JSON fragment"

Find

Find(json any, jsonPath string) any

使用 JSONPath 查找并返回 JSON 中匹配的所有值(导出名为 json.Find)

参数

参数名类型说明
jsonanyJSON 字符串或已解析的对象
jsonPathstringJSONPath 表达式(如 $..a)

返回值

序号类型说明
r1any匹配到的所有值组成的切片

示例

v = json.Find(`{"a":"a1","c":{"a":"a2"}}`, "$..a")
println(v)
assert len(v) == 2, "Find with $..a should match two values"

FindPath

FindPath(json any, jsonPath string) any

使用 JSONPath 查找并返回 JSON 中匹配的第一个值(导出名为 json.FindPath)

参数

参数名类型说明
jsonanyJSON 字符串或已解析的对象
jsonPathstringJSONPath 表达式(如 $..a)

返回值

序号类型说明
r1any第一个匹配到的值

示例

v = json.FindPath(`{"a":"a1","c":{"a":"a2"}}`, "$..a")
println(v) // OUT: a1
assert v == "a1", "FindPath should return the first matched value"

Marshal

Marshal(v any) ([]byte, error)

将一个对象序列化为 JSON 字节(导出名为 json.Marshal)

参数

参数名类型说明
vany要序列化的对象

返回值

序号类型说明
r1[]byte序列化后的 JSON 字节
r2error错误信息(序列化失败时返回)

示例

b = json.Marshal({"a": "b"})~
println(string(b)) // OUT: {"a":"b"}
assert string(b) == "{\"a\":\"b\"}", "Marshal should produce compact JSON bytes"

New

New(i any) (*yakJson, error)

根据传入的值创建一个 JSON 对象(导出名为 json.New)

返回的对象提供 IsObject/IsArray/IsString/IsNumber/IsNull/Value 等类型判断与取值方法

参数

参数名类型说明
iany输入值,可为 JSON 字符串、字节或任意可序列化对象

返回值

序号类型说明
r1*yakJsonJSON 对象
r2error错误信息(解析或序列化失败时返回)

示例

v = json.New(`{"a": "b", "c": "d"}`)~
println(v.IsObject()) // OUT: true
assert v.IsObject(), "New should recognize a JSON object"

ReplaceAll

ReplaceAll(json any, jsonPath string, replaceValue any) any

使用 JSONPath 替换 JSON 中所有匹配的值,返回替换后的对象(导出名为 json.ReplaceAll)

参数

参数名类型说明
jsonanyJSON 字符串或已解析的对象
jsonPathstringJSONPath 表达式(如 $..a)
replaceValueany用于替换的新值

返回值

序号类型说明
r1any替换后的对象

示例

v = json.ReplaceAll(`{"a":"a1","c":{"a":"a2"}}`, "$..a", "b")
s = json.dumps(v)
println(s)
assert str.Contains(s, "\"b\""), "ReplaceAll should replace matched values with the new value"

noEscapeHTML

noEscapeHTML() JsonOpt

设置 json.dumps 时不转义 HTML 字符(导出名为 json.noEscapeHTML)

默认情况下 <, >, & 会被转义为 \u003c 等;启用该选项后保持原样输出

作为 json.dumps 的可选项使用

返回值

序号类型说明
r1JsonOpt可传入 json.dumps 的序列化选项

示例

s = json.dumps({"a": "<x>"}, json.noEscapeHTML())
println(s)
assert str.Contains(s, "<x>"), "noEscapeHTML should keep raw HTML characters"

withIndent

withIndent(indent string) JsonOpt

设置 json.dumps 输出时的缩进字符串(导出名为 json.withIndent)

设置后输出为带缩进的多行 JSON,便于阅读;作为 json.dumps 的可选项使用

参数

参数名类型说明
indentstring每一级缩进使用的字符串(如四个空格)

返回值

序号类型说明
r1JsonOpt可传入 json.dumps 的序列化选项

示例

s = json.dumps({"a": "b"}, json.withIndent("    "))
println(s)
assert str.Contains(s, "\n"), "withIndent should produce multiline output"

withPrefix

withPrefix(prefix string) JsonOpt

设置 json.dumps 输出时每一行的前缀(导出名为 json.withPrefix)

作为 json.dumps 的可选项使用,常配合 withIndent 控制多行 JSON 的排版

参数

参数名类型说明
prefixstring每行前缀字符串

返回值

序号类型说明
r1JsonOpt可传入 json.dumps 的序列化选项

示例

s = json.dumps({"a": "b"}, json.withPrefix(">>"), json.withIndent("  "))
println(s)
assert str.Contains(s, ">>"), "withPrefix should prepend the prefix to indented lines"

可变参数函数详情

dumps

dumps(raw any, opts ...JsonOpt) string

将一个对象转换为 JSON 字符串,返回转换后的字符串

它还可以接收零个到多个请求选项函数,用于配置转换过程,控制转换后的缩进,前缀等

必填参数

参数名类型说明
rawany要序列化的对象

可选参数

参数名类型说明
opts...JsonOpt可选的序列化选项(缩进、前缀、是否转义 HTML 等)

返回值

序号类型说明
r1string序列化后的 JSON 字符串,失败返回空字符串

示例

s = json.dumps({"name": "yak"})
// dumps 默认输出带缩进的多行 JSON,这里打印是否包含被序列化的值
println(str.Contains(s, "yak")) // OUT: true
assert str.Contains(s, "yak"), "dumps output should contain the value"

loads

loads(raw any, opts ...JsonOpt) any

将一个 JSON 字符串转换为对象,返回转换后的对象,通常是一个omap

必填参数

参数名类型说明
rawanyJSON 字符串(任意可转为字符串的输入)

可选参数

参数名类型说明
opts...JsonOpt可选的解析选项(当前预留)

返回值

序号类型说明
r1any解析后的对象,通常是有序 map(omap)

示例

m = json.loads(`{"a": "b", "c": "d"}`)
println(m["a"]) // OUT: b
assert m["a"] == "b", "loads should parse the first field"
assert m["c"] == "d", "loads should parse the second field"