簡體   English   中英

使用JSON.pm跟蹤類型

[英]keeping track of type with JSON.pm

說我有以下輸入的JSON對象

{
   "field1": 21,
   "field2": "21",
   "field3": "hello"
}

有沒有什么辦法可以使用initialize_json或from_json知道值的原始類型(數字和字符串)? 我知道Perl通常不關心類型,但是我需要知道原始類型是什么。 我也知道perl在創建JSON對象時確實會跟蹤類型(因此在創建JSON對象時確實會區分“ 21”和21),所以我希望有一種方法可以在解碼/“發自”時保留該信息明明

我不想以字段名稱為基礎,因為我試圖編寫一些將在某種程度上通用的東西,並且字段名稱可能會更改。

使用JSON :: XS時,標量中的值類型與文檔中的值類型匹配。

$ perl -e'
   use strict;
   use warnings;

   use B        qw( svref_2object SVf_IOK SVf_NOK SVf_POK );
   use JSON::XS qw( decode_json );

   my $data = decode_json(q{[ "4", 4, 4.0, 20000000000000000000 ]});

   for my $i (0..$#$data) {
      my $sv = svref_2object(\( $data->[$i] ));
      my $flags = $sv->FLAGS;
      printf("Scalar %s has %s\n",
         $i,
         join(",",
            $flags & SVf_POK ? "PV" : (),
            $flags & SVf_IOK ? "IV" : (),
            $flags & SVf_NOK ? "NV" : (),
         ),
      );
   }
'
Scalar 0 has PV
Scalar 1 has IV
Scalar 2 has NV
Scalar 3 has PV

如您所見,使用JSON :: XS時,第四個標量是一個例外。 JSON :: XS將很大的數字存儲為字符串,以避免丟失精度。

您使用JSON :: PP得到類似的結果:

Scalar 0 has PV
Scalar 1 has IV
Scalar 2 has NV
Scalar 3 has NV

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM