【问题标题】:Hash every parameter with specific name in json在 json 中散列具有特定名称的每个参数
【发布时间】:2022-12-20 02:47:50
【问题描述】:

我有 jsonb:

{
    "param": 1,
    "code": "abc",
    "nested": [
        {
            "param": 11,
            "code": "abd",
            "nested": {}
        },
        {
            "param": 22,
            "code": "abe",
            "nested": {}
        }
    ]
}

“嵌套”数组中元素的数量可以根据情况而改变。

我需要散列每个“代码”参数。结果我需要获得相同的 jsonb,其中每个“代码”= md5(“代码”)。我怎样才能做到这一点?

我试过 JSON_EACH 但它不起作用:(

【问题讨论】:

  • edit您的问题(通过点击下方的edit 链接)并添加基于该 JSON 的预期结果
  • 向我们展示您尝试过的代码。

标签: json postgresql


【解决方案1】:

替换 json 数据中的多个值非常复杂,因为您需要分解 json 数据结构,然后手动重建它。另外,当你想替换同一个json数据中的多个值时,你需要先创建自己的基于jsonb_set的聚合函数。

将您的 jsonb 数据视为一个字符串可能要简单得多:

CREATE OR REPLACE FUNCTION code_md5 (x jsonb) RETURNS jsonb LANGUAGE sql AS $$
SELECT string_agg(CASE WHEN a.ordinality = 1 THEN a ELSE c.md5_val || substr(a, length(b.val)+1) END, '"code": "') :: jsonb
  FROM regexp_split_to_table(x :: text, '"code": "') with ordinality AS a
 CROSS JOIN LATERAL (SELECT (regexp_match(a, '[^"]+'))[1] AS val) AS b
 CROSS JOIN LATERAL (SELECT md5(b.val) AS md5_val) as c ;
$$ ;

此函数的第一步使用“代码”:“作为分隔符拆分 json 数据。 第二步查找与键“代码”关联的值。 第三步计算哈希值。 最后一步将不同的部分连接在一起,同时用相应的哈希值替换 json 值。

结果是:

{
  "code": "900150983cd24fb0d6963f7d28e17f72",
  "param": 1,
  "nested": [
    {
      "code": "4911e516e5aa21d327512e0c8b197616",
      "param": 11,
      "nested": {}
    },
    {
      "code": "7888d65a43501d992cc38638b59964d6",
      "param": 22,
      "nested": {}
    }
  ]
}

在与键“code”关联的json值内部使用双引号的情况不在该函数的范围内(结果将是错误的)。

dbfiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 2022-06-10
    • 2017-09-02
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多