簡體   English   中英

使用Python將Perl模塊轉換為JSON

[英]Converting a Perl module to JSON with Python

我有一個Perl( .pm )文件,我一直試圖進入JSON表示,以便我可以在其中搜索關鍵字。

我腳本的目錄是/Devices/bin/script.py .pm文件所在的目錄在一個級別,所以/Devices/Devices.PM Devices.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表示形式?

您似乎需要使用Perl腳本(或單行)讀取此內容,因此導出適當的JSON。

首先,顯示的內容不是Perl。 我會假設發布一些基本語法錯誤的拼寫錯誤。

mylist面前也有一個缺失% ; 在Perl變量名稱中以sigil開頭, %表示哈希值。 我會假設這是在發布中的遺漏,但它是存在的。 如果沒有,你必須解決這個問題。

然后讓我使用文件data.pm

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

這是一個簡短的發布數據樣本,並修復了一些拼寫錯誤。

這是一個用它來制作JSON的Perl腳本。 它使用do來執行文件作為腳本,從而將數據結構(哈希)讀入程序。 然后JSON :: PP模塊用於生成JSON ,因為它應該安裝在具有Perl的系統上。

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是一個核心模塊( 自v5.14起 ),但如果外部依賴不是問題,請使用JSON ,如果安裝了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不會返回所有數據。 然后你必須通過其他方式處理文件。

json.dumps從Python對象(如{"foo": True} )轉換為表示該對象為JSON的字符串(如'{"foo": true}' )。 您似乎試圖以另一種方式將包含JSON的文件轉換為Python對象; 執行此操作的函數是json.load 但是,由於Devices.pm不包含JSON,因此仍然無法正常工作。 您需要編寫一個導入Devices.pm的Perl腳本,然后將其內容轉儲為實際的JSON,或者在Python中為Perl編寫解析器。 我推薦第一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM