如何用Perl为JSON数组的每个元素添加双引号
用Perl给JSON数组每个元素添加双引号的靠谱方案
嘿,这个需求我熟!别想着用正则表达式硬怼,很容易踩JSON格式的坑(比如不小心把字符串里的内容给替换错了),用Perl的核心JSON模块来处理才是最稳妥的方式——毕竟专业的事交给专业的工具嘛。
核心思路
先把原始JSON解析成Perl的数据结构,把数组里的所有元素强制转换成字符串类型,最后再重新编码成JSON格式,这样每个元素都会自动带上双引号,完全符合JSON规范。
代码示例(一维数组)
假设你有这样的原始JSON(元素混合了数字、布尔值、已有字符串和null):
[123, true, "hello", null, 45.67]
对应的Perl代码如下:
use strict; use warnings; use JSON; # 原始JSON字符串 my $raw_json = '[123, true, "hello", null, 45.67]'; # 解析成Perl数组引用 my $data = decode_json($raw_json); # 遍历数组,把每个元素转成字符串(强制类型转换) $_ = defined $_ ? "$_" : "null" for @$data; # 重新编码成符合要求的JSON my $formatted_json = encode_json($data); # 输出结果 print $formatted_json;
运行这段代码后,输出的JSON会是:
["123","true","hello","null","45.67"]
处理多维嵌套数组的情况
如果你的JSON是多层嵌套的数组(比如[[1,2], [true,false]]),那需要递归遍历所有元素来转换:
use strict; use warnings; use JSON; sub convert_to_string { my ($item) = @_; if (ref $item eq 'ARRAY') { # 递归处理数组里的每个元素 return [ map { convert_to_string($_) } @$item ]; } else { # 非数组元素转成字符串 return defined $item ? "$item" : "null"; } } my $raw_json = '[[1,2], [true,false], "test"]'; my $data = decode_json($raw_json); my $processed_data = convert_to_string($data); my $formatted_json = encode_json($processed_data); print $formatted_json;
这段代码会把所有层级的数组元素都转成带双引号的字符串,输出结果:
[["1","2"],["true","false"],"test"]
为什么不推荐正则替换?
举个例子,如果你的原始JSON里有字符串"it's true",用正则替换true为"true"的话,会把字符串里的true也给替换了,直接破坏原有内容。而用JSON模块解析后处理,只会针对数组元素的类型进行转换,完全不会影响字符串内部的内容。
内容的提问来源于stack exchange,提问作者N. Nageswara Rao
相关产品推荐
相关产品推荐

