如何解决比较两个JSON,并使用postgreSQL
我有两个JSON文件,其中包含路由表详细信息,并将这两个文件导入到两个表中。现在,我想比较这两个JSON文件并提取新添加,修改或删除的路由。我尝试了以下功能,但未返回预期结果。请找到附加的JSON文件和PostgreSQL函数。
CREATE OR REPLACE FUNCTION jsonb_diff_val(val1 JSONB,val2 JSONB)
RETURNS JSONB AS \$\$
DECLARE
result JSONB;
object_result JSONB;
i int;
v RECORD;
BEGIN
IF jsonb_typeof(val1) = 'null'
THEN
RETURN val2;
END IF;
result = val1;
FOR v IN SELECT * FROM jsonb_each(val1) LOOP
result = result || jsonb_build_object(v.key,null);
END LOOP;
FOR v IN SELECT * FROM jsonb_each(val2) LOOP
IF(v.key <> 'age') THEN
IF jsonb_typeof(val1->v.key) = 'object' AND jsonb_typeof(val2->v.key) = 'object'
THEN
object_result = jsonb_diff_val(val1->v.key,val2->v.key);
-- check if result is not empty
i := (SELECT count(*) FROM jsonb_each(object_result));
IF i = 0
THEN
result = result - v.key; --if empty remove
ELSE
result = result || jsonb_build_object(v.key,object_result);
END IF;
ELSIF val1->v.key = val2->v.key THEN
result = result - v.key;
ELSE
result = result || jsonb_build_object(v.key,v.value);
END IF;
END IF;
END LOOP;
RETURN result;
END;
\$\$ LANGUAGE plpgsql;
杰森1:
{ "uptime.parsed_output": { "route-information": { "route-table": [ { "active-route-count": "3","destination-count": "3","hidden-route-count": "0","holddown-route-count": "0","rt": [ { "rt-destination": "0.0.0.0/0","rt-entry": { "active-tag": "*","age": "2w5d 13:41:08","current-active": "","last-active": "","nh": { "selected-next-hop": "","to": "10.1.73.1","via": "irb.10" },"preference": "5","protocol-name": "Static" } },{ "rt-destination": "10.1.73.0/24","preference": "0","protocol-name": "Direct" } },{ "rt-destination": "10.1.73.10/32","nh": { "nh-local-interface": "irb.10" },"nh-type": "Local","protocol-name": "Local" } } ],"table-name": "inet.0","total-route-count": "3" },{ "active-route-count": "1","destination-count": "1","rt": { "rt-destination": "ff02::2/128","age": "4w4d 22:21:41","nh-type": "MultiRecv","protocol-name": "INET6" } },"table-name": "inet6.0","total-route-count": "1" } ] } }}
杰森2:
{ "uptime.parsed_output": { "route-information": { "route-table": [ { "active-route-count": "3","age": "3w0d 12:42:59","to": "10.1.74.1","via": "irb.20" },{ "rt-destination": "10.0.0.0/8","to": "10.1.79.1","via": "irb.21" },"nh": { "nh-local-interface": "irb.11" },"age": "4w6d 21:23:32","total-route-count": "1" } ] } }}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。