在perl中构建有序的JSON
我对
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’)提取卷列表并对其进行唯一化. 有没有人有更好的建议? 我可以很容易地创建所需结构的散列,例如 $stuff{$site}{$server}{$volume}{$qtree} = $size; 但是那时必须把它变成适当的JSON(我想这可能是一个更好的方法). 解决方法
是的,使用数组而不是对象. JSON对象是无序的.
但似乎你已经在为列表使用数组了. 也许你想要能够执行差异,在这种情况下,JSON.pm提供了一种以sort_by形式指定键的粗略方法.如果你想执行差异,这很有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |