如何使用字符串构造json文本?

时间:2013-11-18 16:09:33

标签: json perl

我正在尝试构建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"}

1 个答案:

答案 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
} );