我正在尝试解析@http://a0.awsstatic.com/pricing/1/ec2/sles-od.min.js写入的JSON
以下是上述链接的快速片段:
{vers:0.01,config:{rate:"perhr",valueColumns:["vCPU","ECU","memoryGiB","storageGB","sles"],currencies:["USD"],regions:[{region:"us-east",instanceTypes:[{type:"generalCurrentGen",sizes:[{size:"t2.micro",vCPU:"1",ECU:"variable",
...
...
...
...
请访问上述链接以查看完整的 JSON。
如上所示,上述 JSON 的键
都没有双引号围绕它们。
这会导致 JSON 字符串格式错误,并且我的 JSON 解析器无法处理它。我还尝试将此 JSON 放入 http://www.jsoneditoronline.org/它也失败了。
现在,这与 Amazon 用于显示其 EC2 实例的各种价格的链接相同。所以我想我在这里遗漏了一些东西。我的谷歌搜索让我相信上面的东西不是 JSON
而是 JSONP
..我不明白那是什么。
你能帮我理解如何解析这个 JSON。顺便说一句,我正在做这项工作 perl使用JSON Module .
一些背景:
Amazon Web Services 没有用于以编程方式获取定价信息的 API。因此,我正在解析这些链接,这就是亚马逊在显示定价信息时所做的事情 here 。此外,我不是来自编程领域,我只知道 perl
。
最佳答案
就像你说的,JSONP 或“带填充的 JSON”无法被 json 解析器解析,因为它不是 json(它是一种不同的格式)。但它实际上是一个带有前缀(padding)的json
填充通常是包装 json 的回调函数的名称。
在这种情况下,它的默认回调名称为“callback”,我们可以通过使用正则表达式来捕获由“callback()”包装的 json 来实现一些最黑客的方式,如下所示
s/callback\((.*)\);$/$1/s;
此外,如果您想使用JSON
库,您可以启用 allow_barekey
这意味着您不需要在这些键周围加上引号。
下面是我的工作代码。我用LWP::Simple
获取给定和 Data::Dump
的内容打印隔离的数据结构。
use strict;
use warnings;
use LWP::Simple;
use JSON;
my $jsonp = get("http://a0.awsstatic.com/pricing/1/ec2/sles-od.min.js")
or die "Couldn't get url";
( my $json = $jsonp ) =~ s/callback\((.*)\);$/$1/s; #grap the json from $jsonp and store in $json variable
my $hash = JSON->new->allow_barekey->decode ( $json );
use Data::Dump;
dd $hash;
输出:
{
config => {
currencies => ["USD"],
rate => "perhr",
regions => [
{
instanceTypes => [
{
sizes => [
{
ECU => "variable",
memoryGiB => 1,
size => "t2.micro",
storageGB => "ebsonly",
valueColumns => [{ name => "os", prices => { USD => 0.023 } }],
vCPU => 1,
},
{
ECU => "variable",
memoryGiB => 2,
size => "t2.small",
storageGB => "ebsonly",
valueColumns => [{ name => "os", prices => { USD => 0.056 } }],
vCPU => 1,
},
{
ECU => "variable",
memoryGiB => 4,
size => "t2.medium",
storageGB => "ebsonly",
valueColumns => [{ name => "os", prices => { USD => 0.152 } }],
vCPU => 2,
},
{
ECU => 3,
memoryGiB => 3.75,
size => "m3.medium",
storageGB => "1 x 4 SSD",
valueColumns => [{ name => "os", prices => { USD => "0.170" } }],
vCPU => 1,
},
....
关于json - 如何解析这个 JSON 对象/字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24998286/