ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
{% raw %} # 9.15\. JSON 函数和操作符 [Table 9-39](#calibre_link-2229)显示了可以用于JSON (参阅[Section 8.14](#calibre_link-1753))数据的操作符。 **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'` | | `#>` | 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}'` | [Table 9-40](#calibre_link-2230)显示了可以用于创建和操作JSON (参阅[Section 8.14](#calibre_link-1753))数据的函数。 **Table 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] ``` | > **Note:** `json`函数和操作符比输入函数类型可以实施更加严格的有效性需求。特别的,他们的检查更为紧密, 任何使用Unicode代理对到Unicode基本多文种平面以外的指定字符是正确的。 > **Note:** 这些函数和操作符中的许多将转换JSON文本中的Unicode逃逸到相应的UTF8字符(当数据库编码为UTF8时)。 在其他编码模式下,转义序列必须是ASCII字符,任何其他在Unicode逃逸序列中的代码点将导致一个错误。 通常,如果可能的话,最好避免JSON中Unicode逃逸和非UTF8数据库编码混合。 > **Note:** [hstore](#calibre_link-382)扩展从`hstore`转换到`json`,所以转换了的`hstore` 值作为JSON对象显示,而不是字符串值。 参阅[Section 9.20](#calibre_link-1641)获取有关聚集函数`json_agg` 的信息,`json_agg`有效的聚合记录值为JSON。 {% endraw %}