如何在perl中将文本文件转换为JSON数据?

如何在perl中将文本文件转换为JSON数据?,perl,Perl,我有一个perl文件名。我想将此文件转换为JSON数据。这在perl中可能吗 sub conversion { my($p)=@_; my $f = $p->{file}; open(FIN,"</pathtofile/$f"); # now i want to convert this opened file into json # something like encode_json(<FIN>); # is that possible? }

我有一个perl文件名。我想将此文件转换为JSON数据。这在perl中可能吗

sub conversion {
  my($p)=@_;
  my $f = $p->{file};
  open(FIN,"</pathtofile/$f");
  # now i want to convert this opened file into json 
  # something like encode_json(<FIN>);
  # is that possible?
}

您可以使用CPAN中的JSON模块从哈希创建JSON。由您定义要JSONify的结构。

您可以使用CPAN的JSON模块从哈希创建JSON。由您定义要JSONify的结构。

您需要找到将文件转换为perl哈希的逻辑,然后使用cpan的“json”模块将其转换为json文本

检查以下代码:

#!/usr/bin/perl -w
use strict;
use JSON;

my $hash = { 
            Waypoint    => {
                            Name    => "001",
                            Type    => "User",
                            Altitude    => "58.441",
                            Depth   => "E77 32.647",
                        },
                };

my $json_text = encode_json $hash;
print $json_text."\n";
其输出为:

{"Waypoint":{"Altitude":"58.441","Type":"User","Depth":"E77 32.647","Name":"001"}}

因为这个问题是关于我们是否可以将txt文件(考虑到提供的示例)转换为json,所以我将示例文件转换为哈希值留给您。然而,从上面的代码来看,将散列转换为json文本非常简单,您需要找到将文件转换为perl散列的逻辑,然后使用cpan的“json”模块将其转换为json文本

检查以下代码:

#!/usr/bin/perl -w
use strict;
use JSON;

my $hash = { 
            Waypoint    => {
                            Name    => "001",
                            Type    => "User",
                            Altitude    => "58.441",
                            Depth   => "E77 32.647",
                        },
                };

my $json_text = encode_json $hash;
print $json_text."\n";
其输出为:

{"Waypoint":{"Altitude":"58.441","Type":"User","Depth":"E77 32.647","Name":"001"}}

因为这个问题是关于我们是否可以将txt文件(考虑到提供的示例)转换为json,所以我将示例文件转换为哈希值留给您。然而,从上面的代码来看,将散列转换为json文本是非常简单的

#!/usr/bin/perl -Tw

use strict;
use warnings;
use JSON qw( to_json );

my $regex = qr{
    \A
        ( \w+ ) \s+          # Header
        ( \d+ ) \s+          # Name
        ( \w+ ) \s+          # Type
        ( \w+ \s+ \S+ ) \s+  # Altitude
        ( \w+ \s+ \S+ )      # Depth
    \z
}xms;

my @rows;
my @columns = split /\s+/, <DATA>;

while ( my $line = <DATA> ) {

    $line =~ s{(?: \A \s* | \s* \z)}{}xmsg;

    if ( $line =~ $regex ) {

        my %record;

        @record{@columns} = ( $1, $2, $3, $4, $5 );

        push @rows, \%record;
    }
    else {

        warn "malformed input: $line";
    }
}

print to_json( \@rows, { pretty => 1 } );


__DATA__
Header   Name Type  Altitude     Depth
Waypoint 001  User  N12 58.441   E77 32.647
Waypoint 002  User N13 00.503    E77 41.714
Waypoint 003  User N13 00.856    E77 42.054
#/usr/bin/perl-Tw
严格使用;
使用警告;
使用JSON-qw(to_-JSON);
我的$regex=qr{
\A
(\w+)\s+#标题
(\d+)\s+#名称
(\w+)\s+#类型
(\w+\s+\s+\s+\s+#高度
(\w+\s+\s+)#深度
\z
}xms;
我的@行;
我的@columns=split/\s+/;
while(我的$line=){
$line=~s{(?:\A\s*|\s*\z)}{}xmsg;
如果($line=~$regex){
我的%记录;
@记录{@columns}=($1、$2、$3、$4、$5);
按@行,\%记录;
}
否则{
警告“格式错误的输入:$line”;
}
}
打印到\u json(\@行,{pretty=>1});
__资料__
标题名称类型高度深度
航路点001用户N12 58.441 E77 32.647
航路点002用户N13 00.503 E77 41.714
航路点003用户N13 00.856 E77 42.054

下面是我该如何做的

#!/usr/bin/perl -Tw

use strict;
use warnings;
use JSON qw( to_json );

my $regex = qr{
    \A
        ( \w+ ) \s+          # Header
        ( \d+ ) \s+          # Name
        ( \w+ ) \s+          # Type
        ( \w+ \s+ \S+ ) \s+  # Altitude
        ( \w+ \s+ \S+ )      # Depth
    \z
}xms;

my @rows;
my @columns = split /\s+/, <DATA>;

while ( my $line = <DATA> ) {

    $line =~ s{(?: \A \s* | \s* \z)}{}xmsg;

    if ( $line =~ $regex ) {

        my %record;

        @record{@columns} = ( $1, $2, $3, $4, $5 );

        push @rows, \%record;
    }
    else {

        warn "malformed input: $line";
    }
}

print to_json( \@rows, { pretty => 1 } );


__DATA__
Header   Name Type  Altitude     Depth
Waypoint 001  User  N12 58.441   E77 32.647
Waypoint 002  User N13 00.503    E77 41.714
Waypoint 003  User N13 00.856    E77 42.054
#/usr/bin/perl-Tw
严格使用;
使用警告;
使用JSON-qw(to_-JSON);
我的$regex=qr{
\A
(\w+)\s+#标题
(\d+)\s+#名称
(\w+)\s+#类型
(\w+\s+\s+\s+\s+#高度
(\w+\s+\s+)#深度
\z
}xms;
我的@行;
我的@columns=split/\s+/;
while(我的$line=){
$line=~s{(?:\A\s*|\s*\z)}{}xmsg;
如果($line=~$regex){
我的%记录;
@记录{@columns}=($1、$2、$3、$4、$5);
按@行,\%记录;
}
否则{
警告“格式错误的输入:$line”;
}
}
打印到\u json(\@行,{pretty=>1});
__资料__
标题名称类型高度深度
航路点001用户N12 58.441 E77 32.647
航路点002用户N13 00.503 E77 41.714
航路点003用户N13 00.856 E77 42.054

y否决票?这可能吗?使用JSON序列化字符串是愚蠢的,以至于有些解析器甚至不支持将字符串作为基本元素。JSON用于序列化数据结构。(不是我投了否决票。)请从文件中添加一些示例内容。您最终得到解决方案了吗?y否决票?这可能吗?使用JSON序列化字符串是愚蠢的,以至于有些解析器甚至不支持将字符串作为基本元素。JSON用于序列化数据结构。(不是我投了否决票。)请从文件中添加一些示例内容。您最终得到解决方案了吗?+1表示“pretty”子句。输出格式让人觉得很舒服。+1表示“pretty”子句。输出格式让人感到安心。