PostgreSQL 9.3.4 文档 | ||||
---|---|---|---|---|
Prev | Up | Chapter 9. 函数和操作符 | Next |
Table 9-39展示了可以用于 JSON 数据(见Section 8.14)的操作符。
Table 9-39. JSON 操作符
操作符 | 右操作数类型 | 描述 | 例子 |
---|---|---|---|
-> | int | 获得 JSON 数组元素 | '[1,2,3]'::json->2 |
-> | text | 获得 JSON 对象域 | '{"a":1,"b":2}'::json->'b' |
->> | int | 以文本形式获得 JSON 数组元素 | '[1,2,3]'::json->>2 |
->> | text | 以文本形式获得 JSON 对象域 | '{"a":1,"b":2}'::json->>'b' |
#> | text数组 | 获取在指定路径的 JSON 对象 | '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}' |
#>> | array of text | 以文本形式获取在指定路径的 JSON 对象 | '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' |
Table 9-40展示了可用于创建和操纵 JSON 数据(见Section 8.14)的函数。
Table 9-40. JSON 支持函数
函数 | 返回类型 | 描述 | 例子 | 例子结果 |
---|---|---|---|---|
array_to_json(anyarray [, pretty_bool]) | json | 把数组作为 JSON 返回。一个 PostgreSQL 多维数组会成为一个数组的 JSON 数组。如果pretty_bool为真,将在维度1的元素之间增加换行。 | array_to_json('{{1,5},{99,100}}'::int[]) | [[1,5],[99,100]] |
row_to_json(record [, pretty_bool]) | json | 把行作为 JSON 返回。如果pretty_bool为真,将在第1层元素之间增加换行。 | row_to_json(row(1,'foo')) | {"f1":1,"f2":"foo"} |
to_json(anyelement) | json | 把值作为 JSON 返回。如果数据类型不是内建的,并且存在一个从该类型到json的造型,改造型函数将被用来执行转换。否则,对于任何不是数字、布尔或空值的值,将会使用文本表示,并且会被逃逸和加上引号使之成为合法的 JSON。 | to_json('Fred said "Hi."'::text) | "Fred said \"Hi.\"" |
json_array_length(json) | int | 返回最外层 JSON 数组中的元素数量。 | json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]') | 5 |
json_each(json) | SETOF key text, value json | 扩展最外层的 JSON 对象成为一组键/值对。 | select * from json_each('{"a":"foo", "b":"bar"}') | key | value -----+------- a | "foo" b | "bar" |
json_each_text(from_json json) | SETOF key text, value text | 扩展最外层的 JSON 对象成为一组键/值对。返回值将是文本类型。 | select * from json_each_text('{"a":"foo", "b":"bar"}') | key | value -----+------- a | foo b | bar |
json_extract_path(from_json json, VARIADIC path_elems text[]) | json | 返回由path_elems指向的 JSON 对象。 | json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4') | {"f5":99,"f6":"foo"} |
json_extract_path_text(from_json json, VARIADIC path_elems text[]) | text | 返回由path_elems指向的 JSON 对象。 | json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4', 'f6') | foo |
json_object_keys(json) | SETOF text | 返回 JSON 对象中的键集合。只有"外面的"对象会被显示。 | json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') | json_object_keys ------------------ f1 f2 |
json_populate_record(base anyelement, from_json json, [, use_json_as_text bool=false] | anyelement | 扩展from_json中的对象成一个行,它的列匹配由 base 定义的记录类型。转换工作将会尽力而为,在from_json中没有对应键的 base 中的列将被留成空。如果一个列被指定超过一次,将会使用最后一次的值。 | select * from json_populate_record(null::x, '{"a":1,"b":2}') | a | b ---+--- 1 | 2 |
json_populate_recordset(base anyelement, from_json json, [, use_json_as_text bool=false] | SETOF anyelement | 扩展from_json中最外的对象集合为一个集合,该集合的列匹配由 base 定义的记录类型。转换工作将会尽力而为,在from_json中没有对应键的 base 中的列将被留空。如果一个列被指定超过一次,将会使用最后一次的值。 | select * from json_populate_recordset(null::x, '[{"a":1,"b":2},{"a":3,"b":4}]') | a | b ---+--- 1 | 2 3 | 4 |
json_array_elements(json) | SETOF json | 将一个 JSON 数组扩展成一个 JSON 元素的集合。 | json_array_elements('[1,true, [2,false]]') | value ----------- 1 true [2,false] |
Note: json函数和操作符能够施加比类型的输入函数更严格的验证要求。特别地,它们检查很多接近于 Unicode 代理对的任意使用来指定位于 Unicode 基本多文种平面之外的字符为正确。
Note: 当数据库编码为 UTF8 时,很多这些函数和操作符将把 JSON 文本中的 Unicode 逃逸转成适当的 UTF8 字符。在其他编码中,该逃逸序列必须是用于一个 ASCII 字符,并且一个 Unicode 逃逸序列中的任意其他代码点将导致一个错误。通常,在一个非 UTF8 数据编码中最好尽可能避免在 JSON 中混杂 Unicode 逃逸。
Note: hstore扩展有一个从hstore到json的造型,这样转换后的hstore值可以被表示成 JSON 对象而不是字符串值。
也可参见Section 9.20了解聚集函数json_agg
,它可以有效地把记录值聚集成 JSON。