我正在尝试构建json文本,如下所示。但是诸如$ token,$ state,$ failedServers之类的变量并没有被其值替换。注意 - 我不想使用任何专门为此工作的模块,我只是想要一些简单的字符串工作。任何人都可以帮助我吗?
my $json = '{"serverToken":"$token", "state":"$state","parameters" :"$failedServers"}';
目前的输出是:
{"serverToken":"$token", "state":"$state","parameters" :"$failedServers"}
需要输出格式:
{"serverToken":"1213", "state":"failed","parameters" :"oracleapps.veeralab.com,suntrust.com"}
答案 0 :(得分:4)
您的变量未被替换,因为它们位于单引号字符串中 - 也就是说,它们位于由'
个字符引用的字符串中。这可以防止变量替换。
使用JSON库(例如this one)创建JSON也会好得多。简单地使用带引号的字符串是非常危险的。假设你的一个变量最终包含一个特殊字符;你最终会得到无效的JSON。
{"serverToken":"123"ABC", "state":"offline", "paramameters":"bugs"}
如果您的变量来自用户输入,那么可能会发生非常糟糕的事情。想象一下,$ token设置为等于foo", "state":"online", "foo":"bar
。您生成的JSON结构将是:
{"serverToken":"foo", "state":"online", "foo":"bar", "state":"offline" ...
当然不是你想要的。
可能的解决方案:
最明显的解决方案是不要使用'
引号字符。这有一个缺点,要求你逃避双引号("
)字符,但这很容易:
my $json = "{\"serverToken\":\"$token\", \"state\":\"$state\",\"parameters\" :\"$failedServers\"}";
另一种选择是使用sprintf:
my $json = sprintf('{"serverToken":"%s", "state":"%s", "parameters":"%s"}', $token, $state, $failedServers);
但到目前为止,最好的解决方案是使用库,因为它不会因为不稳定的输入而破坏:
use JSON;
my $json = encode_json( {
serverToken => $token,
state => $state,
paramaters => $failedServers
} );