2017-04-20 43 views
1

我有一個Perl(.pm)文件,我一直試圖進入JSON表示,以便我可以在其中搜索關鍵字。使用Python將Perl模塊轉換爲JSON

我的腳本的目錄是/Devices/bin/script.py.pm文件所在的目錄在一個級別上,因此/Devices/Devices.PMDevices.PM是包含結構化的字典和列表,像這樣的數據只是一個靜態文件:

mylist = (
    blah => { 
     other  =9, 
     houses  => 1, 
     etc => [ 
      { etc => '5', 
       ppl  => '3, 
       things  => "etc", 
       animals => [ 'blah-228', 'blah-229' ] 
      }, 
      { etc => '9', 
       ppl  => '5', 
       things  => "22", 
       animals => [ 'blah-2', 'blah-5' ] 
      }, 
     ], 
     partner => 'ets', 
     location => 'wherever', 
    }, 
    blah => { 
     ppl => 6, 
     place => 101, 
     things => 'etc', 
     animals => 'whatever', 
    }, 

我:

os.chdir("..") 
with open('Devices.pm', 'r') as f: 
    json_obj = json.dumps(f) 
    print json_obj 

,但我不斷收到TypeError: <open file 'SwitchConfig.pm', mode 'w' at 0x10c1f69c0> is not JSON serializable。我已經嘗試了這幾種方式,沒有運氣,包括json.dump(s)。我不斷收到不同的錯誤。我是否正確理解我的.pm文件結構以將其轉換爲JSON表示?

+0

似乎與此問題有關[Python沒有JSON對象可以被解碼](http://stackoverflow.com/questions/20128772/python-no-json-object-could-be-decoded),也許嘗試複製文件內容到像[jsonlist.com](http://jsonlint.com)的驗證器,並根據需要進行調整 – davedwards

+0

在python 3中,您需要讀取文件'f.read()' – meyer9

+1

看起來你會需要一個(微小的)Perl腳本將其導出爲實際的JSON。至於'.pm'文件本身(你展示的),那是不合法的Perl。 mylist前面需要一個'%'作爲一個有效的哈希(Python中的一個字典),或者一個'@'作爲一個數組(這裏會引起誤解)。這裏顯示的還有其他語法錯誤,我猜拼錯了。你能澄清一下,文件是如何看起來的? – zdim

回答

0

json.dumps將Python對象(如{"foo": True})轉換爲表示該對象的字符串爲JSON(如'{"foo": true}')。您似乎試圖以另一種方式去轉換包含JSON的文件到Python對象;這個功能是json.load。但是,這仍然不起作用,因爲Devices.pm不包含JSON。您需要編寫一個導入Devices.pm的Perl腳本,然後將其內容轉儲爲實際的JSON,或者在Python中爲Perl編寫解析器。我推薦第一種方法。

2

看來你需要用Perl腳本(或單行程序)閱讀此內容,並導出適當的JSON。

首先,顯示的是無效的Perl。在發佈一些基本的語法錯誤時,我會假設輸入錯誤。

mylist前面還有一個缺失的%;在Perl中,變量名稱以sigil開頭,%用於散列。我會假設這是一個遺漏發佈,但它在那裏。如果沒有,你必須解決這個問題。

讓我然後使用文件data.pm

 
%mylist = ( 
    blah => { 
     other => 9, 
     houses => 1, 
     etc => [ { etc => '5', ppl => '3' }, { etc => '9', ppl => '5' } ] 
    } 
); 

這是發佈數據的短樣品,用固定的幾個錯別字。

這是一個Perl腳本,可以從中創建JSON。它使用do將文件作爲腳本執行,從而將數據結構(哈希)讀入程序。然後JSON::PP 模塊用於使JSON不在其中。

use warnings; 
use strict; 
use JSON::PP; 

my %data = do './data.pm'; 

my $data_json = encode_json \%data; 

print $data_json, "\n"; # just to see it 

my $outfile = 'data.json'; 
open my $fh, '>', $outfile or die "Can't open $outfile: $!"; 
print $fh $data_json, "\n"; 
close $fh; 

整個工作在前兩行完成。 JSON::PP是核心模塊(since v5.14),但如果外部依賴性不成問題,請使用JSON,如果安裝該模塊,則使用快速JSON::XS

這非常適合在一襯墊

perl -MJSON::PP -wE'say encode_json { do "./data.pm" }' > data.json 

其中輸出被重定向到該文件。

無論是程序和單行輸出(虛線超過線可讀性)

 
{"blah":{"other":"9","houses":"1","etc": 
    [{"ppl":"3","etc":"5"},{"ppl":"5","etc":"9"}]}} 

什麼是被寫入的文件data.json的內容。

爲此,.pm文件必須僅包含有效的Perl數據結構。如果有更多的變量比這一個散列,這將無法工作,因爲do不會返回所有的數據。那麼你必須通過其他方式來處理文件。

+0

您需要'do'。/ data.pm''。如果沒有'./',它會在'@ INC'中查找'data.pm',而不是當前目錄。 – melpomene

+0

@melpomene哦......謝謝你,糾正。 (我不知道''會去'@ INC')但是,它的工作原理與我發佈的一樣(?)。 (無論如何它只是更好。) – zdim

+0

如果你使用'JSON :: PP'而不是'JSON',你的代碼將不會有任何外部依賴,因爲['JSON :: PP'自5.14以來一直是核心模塊](https ://metacpan.org/pod/perl5140delta#New-Modules-and-Pragmata)。 – melpomene