json - 如何解析这个 JSON 对象/字符串?

标签 json perl amazon-web-services

我正在尝试解析@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。顺便说一句,我正在做这项工作 使用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/

相关文章:

json - 如何在 Amazon 的 cloudformation 模板中列出现有子网?

shell - Perl 捕获子进程的 STDERR 和 STDOUT

amazon-web-services - 如何将 docker 容器镜像更新从 AWS ECR 部署到 ECS?

json - 无法使用 python 读取 json 文件。获取类型错误 : json object is 'TextIOWrapper'

java - 我如何从 json 恢复对象映射?

json - Graphite 的脚本化仪表板

java - 从 AWS Lambda 获取 URL 时出现无提示错误

windows - Perl - 无法在 Windows 上安装 Net::SSH2

当 "src"值不同时,捕获 <img> 标签的正则表达式失败

amazon-web-services - AWS Elasticsearch Update版本6.3-> 7.1