JSON:创建具有漂亮打印的文件时在解码时死亡

发布于 2024-12-19 23:27:51 字数 877 浏览 1 评论 0原文

当我使用漂亮的打印版本时,为什么会出现此错误?

预计为 '"',位于 ./perl.pl 第 29 行的字符偏移量 2 处(“(string end)”之前)。

#!/usr/bin/env perl
use warnings;
use 5.014;
use utf8;
binmode STDOUT, ':encoding(utf-8)';
use Data::Dumper;
use JSON;

my $json = JSON->new->utf8;
my $hashref = { 
    'muster, hanß' => { 
        'hello' => { 
            year => 2000, 
            color => 'green' 
        }
    } 
};

my $utf8_encoded_json_text = $json->pretty->encode( $hashref ); # leads to a die
#my $utf8_encoded_json_text = $json->encode( $hashref ); # works

open my $fh, '>', 'testfile.json' or die $!;
print $fh $utf8_encoded_json_text;
close $fh;

open $fh, '<', 'testfile.json' or die $!;
$utf8_encoded_json_text = readline $fh;
close $fh;
$hashref = decode_json( $utf8_encoded_json_text );
say Dumper $hashref;

Why do I get this error, when I use the pretty print version?

'"' expected, at character offset 2 (before "(end of string)") at ./perl.pl line 29.

#!/usr/bin/env perl
use warnings;
use 5.014;
use utf8;
binmode STDOUT, ':encoding(utf-8)';
use Data::Dumper;
use JSON;

my $json = JSON->new->utf8;
my $hashref = { 
    'muster, hanß' => { 
        'hello' => { 
            year => 2000, 
            color => 'green' 
        }
    } 
};

my $utf8_encoded_json_text = $json->pretty->encode( $hashref ); # leads to a die
#my $utf8_encoded_json_text = $json->encode( $hashref ); # works

open my $fh, '>', 'testfile.json' or die $!;
print $fh $utf8_encoded_json_text;
close $fh;

open $fh, '<', 'testfile.json' or die $!;
$utf8_encoded_json_text = readline $fh;
close $fh;
$hashref = decode_json( $utf8_encoded_json_text );
say Dumper $hashref;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

西瓜 2024-12-26 23:27:51

因为当您读回文件时,您使用的是 readline,并且仅读取文件的第一行。当 Pretty 关闭时,整个输出都在一行上。当启用 Pretty 时,JSON 会分布在多行中,因此您将无效的截断 JSON 传递给 decode_json

使用 local $/ = undef;slurp 或无论你想要什么。

Because when you read the file back in, you're using readline, and only reading the first line of the file. When pretty is off, the entire output is on one line. When pretty is on, the JSON is spread out over multiple lines, so you're passing invalid truncated JSON to decode_json.

Read the entire content by using local $/ = undef; or slurp or whatever else you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文