将 JSON_OBJECT_T 传入 SODA_DOCUMENT_T
Passing in a JSON_OBJECT_T into SODA_DOCUMENT_T
我有一个 PL/SQL 处理程序使用 SODA 程序包来操作 JSON 数据库。我想:
- 读取负载中键
id
的值
- 将负载 JSON 写入数据库中的新文档。
要执行 步骤 1,处理程序将 :body
解析为 JSON_OBJECT_T 类型,以便我可以访问键 id
在有效载荷中。
但是对于步骤2,如果我在用SODA_DOCUMENT_T(b_content=> :body)
构建时再次阅读body
,它只会给我一个空白文档。
我也不能像 SODA_DOCUMENT_T(j_content=> jso)
一样直接传入 JSON_OBJECT_T 变量,因为该函数需要 JSON 类型而不是 JSON_OBJECT_T。我找不到 JSON 类型的文档,但在代码示例中看到函数 JSON('{}')
生成一个。
阅读 :body_text
然而给我带来了其他问题 - 因为 JSON()
函数无法处理有效负载中的换行符并给出错误。
目前要解决这个问题,我正在使用以下方法:
SODA_DOCUMENT_T(
j_content => JSON(jso.to_string())
)
这看起来很愚蠢,因为我在将它转换回 JSON 类型之前再次将其序列化为字符串。是否有正确的方法来读取有效负载的键值,并将其传递到 SODA_DOCUMENT_T?
是的,您不能将 JSON_Object_T
实例传递给 SODA_Document_T
构造函数。但是,您可以使用 JSON_QUERY()
PL/SQL 函数钻取 JSON 给定路径表达式的文档,它 returns 一个 JSON 类型的实例。
示例:
jval := JSON_QUERY(body, '$.id' RETURNING JSON);
在上面的例子中,$.id
是路径表达式,json_query()
returnsjson值对应字段id
从根开始$
文档:
https://docs.oracle.com/en/database/oracle/oracle-database/21/adjsn/function-JSON_QUERY.html
您现在应该能够将 JSON
类型的 jval
实例传递给 SODA_Document_T
构造函数。
是的,我认为您绝对应该避免来回转换。
用法:
SQL>
CREATE OR REPLACE FUNCTION process_request(body IN VARCHAR2)
RETURN JSON
IS
j JSON;
d SODA_Document_T;
BEGIN
j := JSON_QUERY(body, '$.id' RETURNING JSON);
d := SODA_Document_T(j_Content => j);
-- n := coll.insert_one(d);
RETURN j;
END;
13 /
Function created.
SQL> SELECT process_request('{"id":{"type": "string", "val": "DEADBEEF"}}') FROM dual;
PROCESS_REQUEST('{"ID":{"TYPE":"STRING","VAL":"DEADBEEF"}}')
--------------------------------------------------------------------------------
{"type":"string","val":"DEADBEEF"}
我推荐这种方法。让我知道是否有帮助!
备选方案:
顺便说一句,给定一个DOM,你也可以直接转到JSON类型实例,在JSON_Object_T
类型中使用以下方法:
MEMBER FUNCTION GET_JSON RETURNS JSON
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
KEY VARCHAR2 IN
此方法与上面显示的 JSON_Query()
几乎相同:
SQL>
CREATE OR REPLACE FUNCTION process_body(data IN VARCHAR2)
RETURN JSON
AS
body JSON_Object_T;
j JSON;
BEGIN
body := JSON_Object_T.parse(data);
j := body.get_Json('id');
return j;
END;
11 /
SQL> SELECT process_body('{"id":{"type": "string", "val": "DEADBEEF"}}') FROM dual;
PROCESS_BODY('{"ID":{"TYPE":"STRING","VAL":"DEADBEEF"}}')
--------------------------------------------------------------------------------
{"type":"string","val":"DEADBEEF"}
我有一个 PL/SQL 处理程序使用 SODA 程序包来操作 JSON 数据库。我想:
- 读取负载中键
id
的值 - 将负载 JSON 写入数据库中的新文档。
要执行 步骤 1,处理程序将 :body
解析为 JSON_OBJECT_T 类型,以便我可以访问键 id
在有效载荷中。
但是对于步骤2,如果我在用SODA_DOCUMENT_T(b_content=> :body)
构建时再次阅读body
,它只会给我一个空白文档。
我也不能像 SODA_DOCUMENT_T(j_content=> jso)
一样直接传入 JSON_OBJECT_T 变量,因为该函数需要 JSON 类型而不是 JSON_OBJECT_T。我找不到 JSON 类型的文档,但在代码示例中看到函数 JSON('{}')
生成一个。
阅读 :body_text
然而给我带来了其他问题 - 因为 JSON()
函数无法处理有效负载中的换行符并给出错误。
目前要解决这个问题,我正在使用以下方法:
SODA_DOCUMENT_T(
j_content => JSON(jso.to_string())
)
这看起来很愚蠢,因为我在将它转换回 JSON 类型之前再次将其序列化为字符串。是否有正确的方法来读取有效负载的键值,并将其传递到 SODA_DOCUMENT_T?
是的,您不能将 JSON_Object_T
实例传递给 SODA_Document_T
构造函数。但是,您可以使用 JSON_QUERY()
PL/SQL 函数钻取 JSON 给定路径表达式的文档,它 returns 一个 JSON 类型的实例。
示例:
jval := JSON_QUERY(body, '$.id' RETURNING JSON);
在上面的例子中,$.id
是路径表达式,json_query()
returnsjson值对应字段id
从根开始$
文档: https://docs.oracle.com/en/database/oracle/oracle-database/21/adjsn/function-JSON_QUERY.html
您现在应该能够将 JSON
类型的 jval
实例传递给 SODA_Document_T
构造函数。
是的,我认为您绝对应该避免来回转换。
用法:
SQL>
CREATE OR REPLACE FUNCTION process_request(body IN VARCHAR2)
RETURN JSON
IS
j JSON;
d SODA_Document_T;
BEGIN
j := JSON_QUERY(body, '$.id' RETURNING JSON);
d := SODA_Document_T(j_Content => j);
-- n := coll.insert_one(d);
RETURN j;
END;
13 /
Function created.
SQL> SELECT process_request('{"id":{"type": "string", "val": "DEADBEEF"}}') FROM dual;
PROCESS_REQUEST('{"ID":{"TYPE":"STRING","VAL":"DEADBEEF"}}')
--------------------------------------------------------------------------------
{"type":"string","val":"DEADBEEF"}
我推荐这种方法。让我知道是否有帮助!
备选方案:
顺便说一句,给定一个DOM,你也可以直接转到JSON类型实例,在JSON_Object_T
类型中使用以下方法:
MEMBER FUNCTION GET_JSON RETURNS JSON
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
KEY VARCHAR2 IN
此方法与上面显示的 JSON_Query()
几乎相同:
SQL>
CREATE OR REPLACE FUNCTION process_body(data IN VARCHAR2)
RETURN JSON
AS
body JSON_Object_T;
j JSON;
BEGIN
body := JSON_Object_T.parse(data);
j := body.get_Json('id');
return j;
END;
11 /
SQL> SELECT process_body('{"id":{"type": "string", "val": "DEADBEEF"}}') FROM dual;
PROCESS_BODY('{"ID":{"TYPE":"STRING","VAL":"DEADBEEF"}}')
--------------------------------------------------------------------------------
{"type":"string","val":"DEADBEEF"}