加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在perl中构建有序的JSON

发布时间:2020-12-16 06:13:45 所属栏目:大数据 来源:网络整理
导读:我对 JSON和D3有点小提琴,试图以“泡沫”风格表示一些磁盘使用信息. 最初基于此:http://bl.ocks.org/mbostock/4063269 JSON非常简单 – 分层数据看起来有点像这样: http://bl.ocks.org/mbostock/raw/4063530/flare.json { "name": "flare","children": [ {
我对 JSON和D3有点小提琴,试图以“泡沫”风格表示一些磁盘使用信息.

最初基于此:http://bl.ocks.org/mbostock/4063269

JSON非常简单 – 分层数据看起来有点像这样:

http://bl.ocks.org/mbostock/raw/4063530/flare.json

{
 "name": "flare","children": [
  {
   "name": "analytics","children": [
    {
     "name": "cluster","children": [
      {"name": "AgglomerativeCluster","size": 3938},{"name": "CommunityStructure","size": 3812},{"name": "HierarchicalCluster","size": 6714},{"name": "MergeEdge","size": 743}
     ]
    }
   ]
  }
 ]
}

现在,我要做的是从NetApp获取配额报告 – 以XML格式.

我有多个“每服务器”的XML文件看起来大致如下:

<quotas>
  <quota>
    <quota-target>/vol/vol1/qtree1</quota-target>
    <volume>vol1</volume>
    <disk-used>554444</disk-used>
    <disk-limit>2000000</disk-limit>
  </quota>
  <quota>
    <quota-target>/vol/vol1/qtree2</quota-target>
    <volume>vol1</volume>
    <disk-used>1235655</disk-used>
    <disk-limit>2000000</disk-limit>
  </quota>
  <quota>
    <quota-target>/vol/vol2/qtree1</quota-target>
    <volume>vol2</volume>
    <disk-used>987664</disk-used>
    <disk-limit>2000000</disk-limit>
  </quota>
</quotas>

我要做的是组装一些JSON用于D3的层次结构:

>网站
>服务器
>音量
>配额目标
>磁盘使用

我正在使用foreach循环:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use JSON;

my %sites = (
    'site1' => [qw ( servera serverb )],'site2' => [qw ( s2serverc s2serverd)],);

my $data;
$data->{'name'} = "quotas";
foreach my $sitename ( keys %sites ) {
    my $site = { 'name' => $sitename };
    push( @{ $data->{'children'} },$site );
    foreach my $server ( @{ $sites{$sitename} } ) {
        my $server = { 'name' => $server };
        push( @{ $site->{'children'} },$server );

        $twig->parsefile("$server.quotas.xml");
        foreach my $quota ( $twig->get_xpath('//quota') ) {
            push(
                @{ $server->{'children'} },{   'name' => $quota->first_child_text('quota-target'),'size' => $quota->first_child_text('disk-used')
                }
                )

        }
    }
}

open( my $output,">","quotas.json" ) or die $!;
print {$output} to_json( $data,{ 'pretty' => 1 } );
close($output);

这是广泛的工作,并产生了漂亮的图片.

但是我有两个问题:

每次运行时,JSON的排序都会更改,因为我正在使用哈希.虽然不是节目制作者 – 有没有办法可以在JSON输出中强制执行订单? (不一定只是按字母顺序“排序”)

同样 – 我正在研究如何插入一个当前不存在的’音量’级别节点,因为我正在创建新的匿名哈希值以插入到foreach循环的每一层的子节点中.这感觉有点笨拙,但我在想的是:

>使用get_xpath(‘// volume’)提取卷列表并对其进行唯一化.
>每个卷迭代查找匹配的子节点(是否有xpath表达式指定子值?)
>或者创建哈希的’staging’哈希,然后我将其“合并”到JSON中的子项中.

有没有人有更好的建议?

我可以很容易地创建所需结构的散列,例如

$stuff{$site}{$server}{$volume}{$qtree} = $size;

但是那时必须把它变成适当的JSON(我想这可能是一个更好的方法).

解决方法

is there a way I can enforce an order in the JSON output?

是的,使用数组而不是对象. JSON对象是无序的.

An object is an unordered set of name/value pairs.

但似乎你已经在为列表使用数组了.

也许你想要能够执行差异,在这种情况下,JSON.pm提供了一种以sort_by形式指定键的粗略方法.如果你想执行差异,这很有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读