2011-07-22 9 views
15

Decoded JSON wartości logiczne są obiektami:W Perl, sprawdzanie json dekodowane wartość logiczną

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Data::Dumper; 
use JSON; 

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

print Dumper $decoded_json; 

wyjściowa:

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

Z JSON.pm documentation wiem o trzech następujących metod:

  • JSON :: is_bool
  • JSON :: true
  • JSON :: fałszywe

Jednak z jakiegoś głupiego powodu nie wiem, jak ustalić, czy wartość „boolean_field” w $decoded_json jest prawdziwe, czy fałszywe.

(Przepraszamy za bardzo podstawowe pytanie, to było doprowadza mnie Batty!)

+0

Część zamieszania prawdopodobnie pochodzi od samego Perla - ** Perl nie ma typów boolowskich ** w języku. Ma tylko prawdę. Wybierając język dla projektów, jest to jedna rzecz do rozważenia, szczególnie dla użytkowników interfejsów API JSON. –

Odpowiedz

15

To będzie wartość truthy w Perlu. Wystarczy uzyskać do niego dostęp w normalny sposób.

print 'true' if $decoded_json->{'boolean_field'}; 
print 'true' if $decoded_json->{'boolean_field'}; 
+0

Aby się rozwinąć, obiekty boolowskie JSON używają przeciążenia, aby zwrócić '1' dla' true' i '0' dla' false'. Jedyny powód, dla którego obiekty są potrzebne, pozwala odróżnić wartość boolean od rzeczywistej wartości 0 lub 1, jeśli zachodzi taka potrzeba. – friedo

+0

Dzięki! Po przeprowadzeniu dochodzenia uzyskałem dostęp do niego w normalny sposób w kodzie programistycznym, ale inny problem zamaskował poprawne zachowanie, które doprowadziło mnie do wypróbowania wszystkich dziwnych podejść (doh!) – vlee

+0

@Quentin, mam podsystem weryfikacji, w którym muszę sprawdzić, jak ten $ boolean = 'true'; if ($ decoded_json -> {'boolean_field'} eq $ boolean) {# pass}. Ten warunek nie powiedzie się, ponieważ $ decoded_json -> {'boolean_field'} zwraca 1. Jak oceniam, czy ciąg ma wartość "true"? – Subhash

Powiązane problemy