Perl解析JSON數據精解


簡介:
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
它基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 
JSON采用完全獨立於語言的文本格式,
但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。


JSON建構有兩種結構:
json簡單說就是javascript中的對象和數組,
所以這兩種結構就是對象和數組2種結構,通過這兩種結構可以表示各種復雜的結構
1、對象:對象在js中表示為“{}”擴起來的內容,
         數據結構為 {key:value,key:value,...}的鍵值對的結構,
         在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,
         取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
2、數組:數組在js中是中括號“[]”擴起來的內容,
         數據結構為 ["java","javascript","vb",...],
         取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
經過對象、數組2種結構就可以組合成復雜的數據結構了。


解析方法:
JSON文檔的解析可以使用Perl的JOSN模塊,能很方便解析出各種結構和組合中的數據
實例:


#!/usr/bin/perl
use Encode;
use JSON;
use Data::Dumper;

my $json = new JSON;
#或以轉換字符集 my $json = JSON->new->utf8;
my $json_obj;

if(open(MYFILE, "FILE_PATH/json.html")) 
{
  print "讀取json數據成功。\n";
  while(<MYFILE>) 
  {
    $json_obj = $json->decode("$_");
    #見下面的解析方法 
  }
}else{
  print "讀取json數據失敗。\n";
}

1. 對象
"title":"都市女孩"
代碼:
my $title = $json_obj->{'title'};

2. 對象組合
"images":{"small":"http:\/\/img3.douban.com\/spic\/s8968115.jpg",
          "large":"http:\/\/img3.douban.com\/lpic\/s8968115.jpg",
          "medium":"http:\/\/img3.douban.com\/mpic\/s8968115.jpg"
         }
代碼:
my $imgurl  = $json_obj->{'images'}->{'large'};

3. 數組
"countries":["美國"],
"aka":["女孩我最大(台)","衰姐們"]}
代碼:
my $aka = "";
for my $item(@{$json_obj->{'aka'}})
{                                                                                                                                               
  $aka .= $item.",";                                                                                                                            
}

4. 對象與數組的組合
"casts":[
         {"avatars":{"small":"http:\/\/img3.douban.com\/img\/celebrity\/small\/21417.jpg",
                     "large":"http:\/\/img3.douban.com\/img\/celebrity\/large\/21417.jpg",
                     "medium":"http:\/\/img3.douban.com\/img\/celebrity\/medium\/21417.jpg"
                    },
          "alt":"http:\/\/movie.douban.com\/celebrity\/1011562\/",
          "id":"1011562",
          "name":"劉濤"
         },
         {"avatars":{"small":"http:\/\/img3.douban.com\/img\/celebrity\/small\/34429.jpg",
                     "large":"http:\/\/img3.douban.com\/img\/celebrity\/large\/34429.jpg",
                     "medium":"http:\/\/img3.douban.com\/img\/celebrity\/medium\/34429.jpg"
                    },
         "alt":"http:\/\/movie.douban.com\/celebrity\/1044611\/",
         "id":"1044611",
         "name":"保劍鋒"
         },
         {"avatars":{"small":"http:\/\/img3.douban.com\/img\/celebrity\/small\/33257.jpg",
                     "large":"http:\/\/img3.douban.com\/img\/celebrity\/large\/33257.jpg",
                     "medium":"http:\/\/img3.douban.com\/img\/celebrity\/medium\/33257.jpg"
                    },
          "alt":"http:\/\/movie.douban.com\/celebrity\/1315704\/",
          "id":"1315704",
          "name":"謝祖武"
         },
         {"avatars":null,
          "alt":null,
          "id":null,
          "name":"喬大韋"
         }
        ]
for my $item(@{$json_obj->{'casts'}})                                                                                                           
{                                                                                                                                               
  $cast .= $item->{'name'}.",";                                                                                                                 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM