问题报告 纠错本页面

9.15. JSON 函数和操作符

表 9-39显示了可以用于JSON (参阅第 8.14 节)数据的操作符。

表 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'
#>array of 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}'

表 9-40显示了可以用于创建和操作JSON (参阅第 8.14 节)数据的函数。

表 9-40. JSON 支持函数

函数返回类型描述示例示例结果
array_to_json(anyarray [, pretty_bool]) json 作为JSON返回数组。一个PostgreSQL多维数组成为一个JSON数组的数组。 如果pretty_bool为 true,将在维度1的元素之间添加换行符。 array_to_json('{{1,5},{99,100}}'::int[])[[1,5],[99,100]]
row_to_json(record [, pretty_bool]) json 作为JSON返回行。如果pretty_bool为 true,将在第一级元素之间添加换行符。 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对象为一组键/值对。返回值为text类型。 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里的对象到一行,这行的字段匹配基础定义的记录类型。 转换将会很好的进行;没有与from_json里的键对应的基础字段将会缺省为null。 如果一个字段指定了多次,那么将使用最后一个值。 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里面最外层的对象集到一个集合, 这个集合的字段匹配基本定义的记录类型。转换将会很好的进行; 没有与from_json里的键对应的基础字段将会缺省为null。 如果一个字段指定了多次,那么将使用最后一个值。 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]

注意: json函数和操作符比输入函数类型可以实施更加严格的有效性需求。特别的,他们的检查更为紧密, 任何使用Unicode代理对到Unicode基本多文种平面以外的指定字符是正确的。

注意: 这些函数和操作符中的许多将转换JSON文本中的Unicode转义到相应的UTF8字符(当数据库编码为UTF8时)。 在其他编码模式下,转义序列必须是ASCII字符,任何其他在Unicode转义序列中的代码点将导致一个错误。 通常,如果可能的话,最好避免JSON中Unicode转义和非UTF8数据库编码混合。

注意: hstore扩展从hstore转换到json,所以转换了的hstore 值作为JSON对象显示,而不是字符串值。

参阅第 9.20 节获取有关聚集函数json_agg 的信息,json_agg有效的聚合记录值为JSON。