如何用Rego合并JSON大小写敏感键值为统一小写键?
Rego实现不区分大小写键名合并值
输入JSON
{ "data": { "abc": 123, "Abc": 345, "bcd": 789 } }
期望输出
{ "data": { "abc": "123,345", "bcd": "789" } }
需求:实现键名不区分大小写,将同一键(大小写不敏感)对应的多个值合并为逗号分隔的字符串。
遇到的错误
policy.rego:3: eval_conflict_error: object keys must be unique
尝试的Rego代码
result := {lower(key): input.data[key] | count(key)>0}
解决方案
你遇到的错误是因为直接用lower(key)作为对象键时,abc和Abc会生成同一个键,导致对象键冲突。正确的做法是先按小写键分组收集值,再将每组值转为逗号分隔字符串:
# 按小写键分组,收集对应所有值 grouped := { lower_key: values | lower_key := lower(key); values := [input.data[k] | k := input.data[_]; lower(k) == lower_key] } # 将分组后的列表转为逗号分隔字符串,生成最终结果 result := { key: concat(",", [string(v) | v := vals]) | key, vals := grouped[_] }
代码说明
- 分组阶段:遍历输入的所有键,将键转为小写后作为分组键,收集所有对应小写键的原始值,形成键为小写、值为列表的对象。
- 字符串转换阶段:遍历分组结果,将每个列表中的数值转为字符串,再用
concat函数拼接成逗号分隔的字符串,最终生成符合要求的对象。
内容的提问来源于stack exchange,提问作者Shivshankar Nagarsoge
相关产品推荐
相关产品推荐

