如何对数组内对象的所有值应用$replace函数去除特殊字符?
JSONata处理对象值去除特殊字符报错解决
原始JSON数据
{ "result": [ { "codigo_produto": "10162", "gtin": "0000040084107", "descricao_produto": "Kinder Ovo", "un_venda": "UN", "segmento_1": "10000", "cod_segmento_1": "Geral" }, { "codigo_produto": "185680", "gtin": "7892840127114", "descricao_produto": "Pingo D'ouro Picanha 65gr", "un_venda": "UN", "segmento_1": "10000", "cod_segmento_1": "Geral" } ] }
需求
对result数组内每个对象的所有值应用$replace($value, /[^a-zA-Z0-9 ]/, ''),去除所有特殊字符。
尝试的错误代码及报错
错误代码
$ ~> | result | $each( function($object) { $each($object, function($k, $v) { {$k: $replace($v, /[^a-zA-Z0-9 ]/, '') } }) } ) ~> $merge() |
报错信息
Argument 1 of function "each" does not match function signature
解决方案
错误原因
- 参数顺序错误:JSONata中
$each处理对象时,回调函数的参数顺序是($value, $key),你写成了($k, $v),导致参数不匹配函数签名。 - 缺少对象合并:内层
$each会返回多个独立的键值对对象,需要用$merge()将它们合并为一个完整的对象,否则无法生成有效的商品对象。
修正后的代码
方案一:调整参数顺序并添加合并
$ ~> | result | $each( function($object) { $merge($each($object, function($v, $k) { {$k: $replace($v, /[^a-zA-Z0-9 ]/, '') } })) } ) |
方案二:使用$objectTransform更简洁实现
$objectTransform是JSONata中专门用于转换对象键值的函数,写法更简洁:
$ ~> | result | $each(function($obj) { $objectTransform($obj, function($k, $v) { $replace($v, /[^a-zA-Z0-9 ]/, '') }) }) |
处理后结果
第二个商品的descricao_produto会从"Pingo D'ouro Picanha 65gr"变为"Pingo Douro Picanha 65gr",所有特殊字符被去除,其他字段保持原样。
内容的提问来源于stack exchange,提问作者Mathias Hillmann
相关产品推荐
相关产品推荐

