ブール値を返すPostgreSQLシステムに関するクエリがあります。
my $sth = $dbh->prepare("select 'f'::boolean");
$sth->execute;
my @vals = $sth->fetchrow_array;
DBD :: Pg docsによると、
PostgreSQLの現在の実装では、trueの場合は「t」、falseの場合は「f」が返されます。Perlの観点からは、これはかなり不幸な選択です。したがって、DBD :: Pgは、BOOLデータ型の結果をPerlishの方法で変換します。「f」は数値0になり、「t」は数値1になります。このようにして、アプリケーションはデータベース固有の戻り値をチェックする必要がありません。 Perlは0をfalseとして扱い、1をtrueとして扱うため、データ型はBOOLです。必要に応じて、pg_bool_tf属性をtrue値に設定して、値を「t」および「f」に戻すことができます。
したがって、pg_bool_tfが0を返す限り、そのステートメントは0を返す必要があります。ただし、途中のどこかで、JSON :: XS(およびプレーンJSON)は返された0を文字列として解釈します。
use JSON::XS qw(encode_json);
my $options =
{
layout => 0,
show_widget_help => $vals[0] // 1,
};
die encode_json($options);
...で死ぬ:
{"layout":0、 "show_widget_help": "0"}
...これは問題ありませんが、JavaScriptがブール値を期待していて、空でない文字列「0」がtrueと評価される点が異なります。後者の0が引用され、前者が引用されないのはなぜですか?
JSON :: XSドキュメントによると、これは主な機能です。
往復の整合性
JSONでサポートされているデータ型のみを使用してperlデータ構造をシリアル化する場合、逆シリアル化されたデータ構造はPerlレベルで同じです。(たとえば、文字列「2.0」が数字のように見えるからといって、突然「2」になることはありません)。これにはマイナーな例外があります。それらについては、以下のマッピングセクションをお読みください。
...これは言う:
単純なPerlスカラー(参照ではないスカラー)は、エンコードするのが最も難しいオブジェクトです。JSON:: XSは、未定義のスカラーをJSON null値としてエンコードし、JSON文字列としてエンコードする前に文字列コンテキストで最後に使用されたスカラーをエンコードします。数値として他のもの。
しかし、文字列コンテキストで@vals[0]を使用することはありません。たぶんDBD::Pgはブール値0を返す前に、どこかで文字列として使用しますか?