5

ブール値を返す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を返す前に、どこかで文字列として使用しますか?

4

1 に答える 1

5

JSON::XSドキュメントによると、以下は / に変換されtrueますfalse

  • 整数への参照0および1、すなわち。\0\1
  • JSON::XS::trueJSON::XS::false

これらのいずれかを使用すると、問題が解決するはずです

于 2009-07-06T14:45:44.810 に答える