在Perl中,如何判断JSON字符串是否没有元素?

bq8i3lrv  于 2023-06-23  发布在  Perl
关注(0)|答案(4)|浏览(154)

我正在尝试将一个字符串与另一个字符串进行比较。
如果它是一个包含内容的JSON结构,我想打印“contains things”。如果它是一个不包含任何东西的JSON结构,我打印“empty”如果它不是在大括号“{}"之间的东西,我打印有错误。
我是这么做的

if($content =~ m/{.+}/){
    print "Contains things \n";
} elsif($content eq "{}"){
    $job_status{$url}="";
    print "empty \n";
} else {
    print "Error \n";
}

当我将“{}”传递给变量$content时,他没有输入“elsif”,而是转到“else”,并抛出错误。
我试着在if中使用“==”而不是“eq”,尽管我知道它是用于数字的。当这样做时,他输入“elsif”,并打印“empty”,就像他应该对“eq”做的那样,并抛出:

Argument "{}" isn't numeric in numeric eq (==)".

我可以使用JSON库,但我不喜欢。

kpbpu008

kpbpu0081#

对我很有效。$content有换行符吗?试试chomp $content;

use warnings;
use strict;

my $content = '{}';
if($content =~ m/{.+}/s){
    print "Contains things \n";
} elsif($content eq "{}"){
    print "empty \n";
} else {
    print "Error \n";
}

__END__

empty
nbysray5

nbysray52#

我不喜欢八年前的答案。现在我只想看看JSON:

use v5.36;
use experimental qw(builtin);
use builtin qw(reftype); # or get it from Scalar::Util

use JSON;

my @inputs = (
    '{', '}', 'abc',
    '{}', '{"a":"b"}',
    );

foreach my $input ( @inputs ) {
    my $json = eval { decode_json( $input ) };

    my $empty =
        defined( $json ) &&
        ( reftype $json eq reftype {} and 0 == keys $json->%* );

    say "INPUT: $input --> ", $empty ? 'Empty' : 'Not empty (or not JSON)';
    }

如果你在程序之外,有jq

$ jq '. == {}' <<< "{}"
true

$ jq '. != {}' <<< "{}"
false

一个顶级的JSON可以是一个对象({...})或一个数组([...]),但你只检查其中的一个。如果你只是想看看它是否为空,我会检查字符串的长度:

chomp $possible_json;
if( $length $possible_json >= 3 ) { ... }

你也可以考虑Randal Schwartz的regex for JSON parsing。它不能处理所有的事情,但它通常足以处理简单的事情。

qrjkbowd

qrjkbowd3#

如果我在{}后面添加一个换行符,我可以复制这个行为:

#!/usr/bin/perl
use strict;
use warnings;

my $content = "{}\n";

if($content =~ m/{.+}/s){
    print "Contains things \n";
} elsif($content eq "{}"){
    print "empty \n";
} else {
    print "Error \n";
}

它返回“Error”,如果我用==替换eq,它返回empty,因为"{}""{}\n"的数值都是0。正如你提到的,一个警告被抛出。
在处理$content之前,您可能会尝试chomp

cuxqih21

cuxqih214#

我可能会把它拆散:

unless ($content) {print "Error\n"};
$content =~ /{(.*)}/
my $resp = $1;
if ($resp) {
 print "Contains Things ($resp)\n";
} else {
 print "Empty\n";
}

相关问题