2010-08-20 10 views
8

Perl: 如何使用JSON :: PP對一個複雜結構進行排序?perl:如何對「根」鍵屬性以外的東西對JSON結構進行排序

從JSON文件:

正如 JSON :: PP範圍排序例程運行,給定的子程序 名和特殊變量$ A,$ B 將開始「JSON :: PP ::」。

這裏是我的嘗試,似乎不工作

open my $fh, ">", $file or warn " exportAsJSON: can't open file: '$file': $!"; 
print $fh $coder->sort_by(sub {$_->{column_def}->{$JSON::PP::a} cmp $_->{column_def}->{$JSON::PP::b} })->encode(\%json); 
close $fh; 

我想通過鍵進行排序,然後在下面的「COLUMN_DEF」的屬性鍵COLUMN_DEF屬性,即 密度,depth_in_m,mag_sus :

{ 
    "column_def": 
     { 
      "depth_in_m": 
       { 
        "names":"depth_in_m", 
        "pos":"0" 
       }, 
      "mag_sus": 
       { 
        "names": 
         { 
          "A_ALIAS":"Mag-Sus.", 
          "A_DESC":"magnetic susceptibility in SI", 
          "ATTRIBUTE":"MAG_SUS" 
         }, 
        "pos":"2" 
       }, 
      "density": 
       { 
        "names": 
         { 
          "A_ALIAS":"Density", 
          "A_DESC":"density in gm\/cc", 
          "ATTRIBUTE":"DENSITY" 
         }, 
        "pos":"1" 
       } 
     }, 
    "data": 
     { 
      "depth_in_m":"14.635", 
      "mag_sus":"n.a.", 
      "density":"n.a." 
     } 
} 
+3

我很想知道爲什麼你要排序的東西,將解析爲散列 - 這沒有固有的順序。 – 2010-08-20 15:01:56

+1

@熊會吃掉你:事實上,內存中的表示沒有固有的順序。我想將排序後的散列結構保存到一個文件(或臨時文件)中,進行差異化和目視檢查(以及之後的更復雜的事情)。 – knb 2010-08-23 10:02:03

回答

14

我不能肯定我明白你怎麼想的JSON輸出進行排序 - 除了通過哈希鍵排序。如果這就是你想要的,只要通過canonical方法一個真實的論點。

use strict; 
use warnings; 

use JSON::PP; 

# A simple hash-of-hashes for exploration. 
my $h = { 
    Z => { c => 1, d => 2 }, 
    A => { a => 3, r => 4 }, 
    B => { c => 5, x => 6 }, 
    S => { q => 7, d => 8 }, 
}; 

my $js = JSON::PP->new; 
$js->canonical(1); 

my $output = $js->encode($h); 
print $output; 

如果你使用的sort_by方法,它沒有任何意義的sort塊中使用$_:那會是什麼表現?從文檔中不清楚sort_by代碼將會收到什麼樣的論據。使用Data::Dumper這樣的:

use Data::Dumper qw(Dumper); 

my $sorter = sub { 
    # See what's going on. 
    print "$JSON::PP::a cmp $JSON::PP::b\n"; 
    print Dumper(\@_, $_); 
    <STDIN>; 

    # Sort hash keys alphabetically. 
    $JSON::PP::a cmp $JSON::PP::b; 
}; 

my $output = $js->sort_by($sorter)->encode($h); 

可以推斷sort_by是這樣的:(1)它接收兩個參數,JSON::PP對象和哈希REF目前正在與合作;和(2)$JSON::PP::a$JSON::PP::b變量保存被比較的散列鍵。 但是請注意這個哈希引用指的是JSON輸出,因爲它是從葉節點向上構建的。它不涉及您的原始數據結構。這似乎使編寫比較器的任務變得有點棘手。祝你好運。

my $sorter = sub { 
    my ($json_pp_object, $hash_ref) = @_; 

    # Write your own comparator here. 
}; 

my $output = $js->sort_by($sorter)->encode($h); 
+0

意向排序: 首先按哈希鍵字母順序排列, 按字母順序排列依次排列第一個哈希引用子鍵。 或者,(第二個)用「pos」的值(在弄清楚嵌套結構上的排序是如何工作的)的數值。 – knb 2010-08-23 10:38:20

+0

個人記事:這是一個類似的問題:http://stackoverflow.com/questions/4041762/iterating-over-a-javascript-object-in-sort-order-based-on-particular-key-value-of – knb 2010-11-08 15:57:24

+1

在寫你自己的分揀機時請注意。看起來$ JSON :: PP :: VERSION ='2.27200'不會將JSON :: PP對象作爲第一個參數。對於最後一個例子,版本> = 2.27200的分揀機需要使用我的$ hashref = shift; – heymatthew 2012-04-01 05:14:21

相關問題