序列化複雜的嵌套 JSON - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

序列化複雜的嵌套 JSON

本主題示範如何以JSON格式序列化巢狀資料。嵌套數據是包含嵌套字段的數據。巢狀欄位是以單一實體形式結合在一起的欄位,例如陣列、結構或物件。

本教學課程中示範的方法的替代方法是將頂層巢狀集合資料行查詢為序列化JSON。您可以使用序列化來檢查、轉換和擷取巢狀資料,就像使用 Redshift Spectrum JSON 一樣。此方法支援ORC、JSON、離子和鑲木地板格式。使用工作階段組態參數 json_serialization_enable 來設定序列化行為。設定時,複雜JSON資料類型會序列化為 VARCHAR (65535)。嵌套JSON可以使用訪問JSON 函數。如需詳細資訊,請參閱json_serialization_enable

例如,如果沒有設定 json_serialization_enable,下列直接存取巢狀欄的查詢會失敗。

SELECT * FROM spectrum.customers LIMIT 1; => ERROR: Nested tables do not support '*' in the SELECT clause. SELECT name FROM spectrum.customers LIMIT 1; => ERROR: column "name" does not exist in customers

設定 json_serialization_enable 可讓您直接查詢頂層集合。

SET json_serialization_enable TO true; SELECT * FROM spectrum.customers order by id LIMIT 1; id | name | phones | orders ---+--------------------------------------+----------------+---------------------------------------------------------------------------------------------------------------------- 1 | {"given": "John", "family": "Smith"} | ["123-457789"] | [{"shipdate": "2018-03-01T11:59:59.000Z", "price": 100.50}, {"shipdate": "2018-03-01T09:10:00.000Z", "price": 99.12}] SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": "John", "family": "Smith"}

序列化嵌套JSON時,請考慮以下項目。

  • 當集合資料行序列化為 VARCHAR (65535) 時,無法直接存取其巢狀子欄位做為查詢語法的一部分 (例如,在篩選條件子句中)。但是,JSON函數可以用來訪問嵌套JSON。

  • 不支援下列特殊表示法:

    • ORC工會

    • ORC具有複雜類型鍵的映射

    • Ion 資料包

    • 離子 SEXP

  • 時間戳記會傳回為ISO序列化字串。

  • 原始映射鍵被提升為字串 (例如,1"1")。

  • 頂級空值被序列化為NULLs。

  • 如果序列化溢出 65535 的最大大VARCHAR小,則儲存格會設定為。NULL

序列化包含字JSON符串的複雜類型

默認情況下,嵌套集合中包含的字符串值被序列化為轉義JSON字符串。當字符串有效時,轉義可能是不可取的。JSON相反,您可能想要編寫嵌套的子元素或VARCHAR直接為字段。JSON使用 json_serialization_parse_nested_strings 工作階段層級組態啟用此行為。同時設定json_serialization_enablejson_serialization_parse_nested_strings時,有效JSON值會以內嵌方式序列化,不含逸出字元。當值無效時JSON,會將其逸出,就好像未設定json_serialization_parse_nested_strings組態值一樣。如需詳細資訊,請參閱json_serialization_parse_nested_strings

例如,假設上一個範例中的資料包含JSON為 name VARCHAR (20) 欄位中的structs複雜類型:

name --------- {"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}

設定 json_serialization_parse_nested_strings 時,name 欄會依照下列方式序列化:

SET json_serialization_enable TO true; SET json_serialization_parse_nested_strings TO true; SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": {"first":"John","middle":"James"}, "family": "Smith"}

而不是這樣逸出:

SET json_serialization_enable TO true; SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}