如何将json解码的布尔值计算为;“真的”;

如何将json解码的布尔值计算为;“真的”;,json,perl,boolean-expression,Json,Perl,Boolean Expression,关于, 我有一个验证潜艇,我需要像这样检查 my $boolean = 'true'; my $json_string = '{"boolean_field":true}'; my $decoded_json = from_json $json_string; &verify($boolean); $boolean = 'false'; $json_string = '{"boolean_field":false}'; $decoded_json = from_json $json

关于,

我有一个验证潜艇,我需要像这样检查

my $boolean = 'true';
my $json_string = '{"boolean_field":true}'; 
my $decoded_json = from_json $json_string;

&verify($boolean);

$boolean = 'false';
$json_string = '{"boolean_field":false}';
$decoded_json = from_json $json_string;

&verify($boolean);

sub verify {
  my $boolean = shift;
  if( $decoded_json->{'boolean_field'} eq $boolean ){
     # both are equal
  }
如果条件失败,则会出现这种情况,因为
$decoded_json->{'boolean_field'}
返回1或0

如何将
$decoded_json->{'boolean_field'}
计算为字符串'true'或'false'

我现在的工作是

my $readBit = ($boolean =~ /false/ ) ? 0 : 1 ;
if( $decoded_json->{'boolean_field'} eq $readBit){
   # both are equal
}

我们不需要使用正则表达式来确定它是真还是假。
0、unde、false
是假值,其余是真值。你能试试这个解决方案吗

use strict;
use warnings;
use JSON;

my $json_string = '{"boolean_field":0}';
# I tried with many possible combinations of boolean_field
# 0, false => returned false
# 1, 50 (Any value), true => returned true

my $decoded_json = from_json $json_string;
print 'true' if exists $decoded_json->{'boolean_field'};
# exists will check whether key boolean_field exists. It won't check for values

编辑:用户只需检查键,添加的
存在
条件。

如果您有布尔值,则不应使用字符串比较来检查其值。你应该只问它是真是假。您的代码应该更像这样:

#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

use JSON;

my $json_string = '{"boolean_field":true}';
my $decoded_json = from_json $json_string;

boolean_check($decoded_json->{boolean_field});

$json_string = '{"boolean_field":false}';
$decoded_json = from_json $json_string;

boolean_check($decoded_json->{boolean_field});

sub boolean_check {
  my $value = shift;

  if ($value) {
    say 'Value is true';
  } else {
    say 'Value is false';
  }
}
如果您使用Data::Dumper查看
$decoded_json
,您将看到
布尔值_字段
将包含一个对象,该对象将根据需要返回true或false值

$VAR1 = {
          'boolean_field' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
        };

这没有任何意义。如果它是
1
,那么它就不是
“true”
<代码>'false'是一个字符串,它不是布尔逻辑意义上的“false”。“我想这就是你问题的根源。”昆汀改变了我原来的问题。如果使用JSON模块或同一系列中的一个对字符串进行解码,则两种情况下都有一个单独的验证子项(true和false),布尔值将被转换为具有适当重载的对象,以返回truthy或false值。你只需要直接评估它。有关布尔值,请参阅cpan上JSON的文档。您引用的答案正好说明了您需要什么。在这两种情况下,我需要进入if块(true和false)。我不想检查键是否存在。我正在验证
boolean\u字段的值
。不确定您认为
存在的原因
在这里是否有用。您需要检查值的真实性。@DaveCross:在上面的评论中,他写道我需要进入if块,在这两种情况下,(真和假)。我认为可以从
存在
,但请纠正我。然后他说**我不想检查键是否存在'。我不确定问题是在于他对任务的理解,还是在于他的英语:-)