如何解析此JSON对象/字符串?

萤光素杀死

我正在尝试解析写在@ 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。

如上所示,keys以上JSON中没有一个包含双引号

这导致格式错误的JSON字符串,而我的JSON解析器却失败了。我还尝试将此JSON放在http://www.jsoneditoronline.org/中,但同样失败。

现在,这是Amazon用于显示其EC2实例的各种价格的链接。所以我想我在这里错过了一些东西。我的Google搜索使我相信以上事实并非如此JSON,而是JSONP..我不明白那是什么。

您能否帮助我了解如何解析此JSON。顺便说一句,我正在使用JSON模块进行这项工作

一些背景:

Amazon Web Services没有API以编程方式获取定价信息。因此,我正在解析这些链接,这是亚马逊在此处显示价格信息时正在做的事情此外,我不是来自编程领域,perl而是我所知道的一切。

zdk

就像您说的那样,JSON解析器无法解析JSONP或“带填充的JSON”,因为它不是json(这是一种不同的格式)。但这实际上是带有前缀(填充)的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,
                                 },
....

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章