[Moscow.pm] JSON::XS, mod_perl, boolean

Толян II agrishaev на gmail.com
Вт Ноя 28 11:53:51 PST 2017


Можно посмотреть на ошибку в следующем скрипте:
======================
use strict;
use threads;

my $s = "[40, true]";

sub start_thread {
    require JSON::XS;
    my $json = JSON::XS->new();
    $json->convert_blessed(1);
    $json->allow_blessed(1);
    my $x = $json->decode($s);
    for my $k (0..1){
        print "Th(@_, $k)\n";
        ++$x->[0];
        say $json->encode($x);
        sleep 1;
    }
}

sub main{
    my @argv  = @_;
    my @thr;
    for my $i (1..2){
        push @thr, threads->create(\&start_thread, "i=$i");
    }
    for my $t (@thr){
        $t->join();
    }

};

main(@ARGV);
===================================

Он выводит в одном потоке [*, true], а в другом [*,null], типа такого
====================
Th(i=2, 0)
Th(i=1, 0)
[41,true]
[41,null]
Th(i=1, 1)
Th(i=2, 1)
[42,null]
[42,true]

===================================

C помощью патча на JSON::XS
===================================
diff --git a/XS.xs b/XS.xs
index 9c9c3cf..a96f0bf 100644
--- a/XS.xs
+++ b/XS.xs
@@ -775,8 +775,18 @@ encode_rv (enc_t *enc, SV *sv)
   if (expect_false (SvOBJECT (sv)))
     {
       HV *stash = SvSTASH (sv);
+      bool is_perl_bool = 0;
+      char *class_name = HvNAME(stash);
+      if (class_name[0] == 'J'){
+        if (strcmp(class_name, "JSON::PP::Boolean") == 0){
+          ++is_perl_bool;
+        }
+        else if (strcmp(class_name, "JSON::XS::Boolean") == 0){
+          ++is_perl_bool;
+        }
+      }

-      if (stash == bool_stash)
+      if (is_perl_bool)
         {
           if (SvIV (sv))
             encode_str (enc, "true", 4, 0);
============================


Вывод исправляется на валидный
========================
Th(i=1, 0)
[41,true]
Th(i=2, 0)
[41,true]
Th(i=1, 1)
[42,true]
Th(i=2, 1)
[42,true]
=========================

Надеюсь это та ошибка, о которой пишет топикстартер.


28 ноября 2017 г., 20:31 пользователь KES via Moscow-pm <moscow-pm на pm.org>
написал:

> JSON запрос, который пришел и в котором возникла указанная ошибка
>
>
> 28.11.2017, 15:30, "Pavel Zabolotniy" <tim на myrz.ru>:
>
>
>
> 28.11.2017 16:04, KES пишет:
>
> А дампа исходного запроса нет, где словили null?
>
>
>
> Что подразумевается под дампом? Может сможем сделать.
>
> 28.11.2017, 14:24, "Pavel Zabolotniy via Moscow-pm" <moscow-pm на pm.org>
> <moscow-pm на pm.org>:
>
>
> 28.11.2017 14:57, Толян II via Moscow-pm пишет:
>
> Прямо с такой нет, но boolean несколько граблей было собрано, и мне
> пришлось заменить JSON::true и JSON::false на  \0, и \1 в конфигурации \(my
> $s=1) и \(my $s=0).
> Возможно тебе это поможет.
>
> А у тебя такая проблема возникла или ты просто спрашиваешь?
>
>
>
>
> Да, такая проблема воникла.
> Там, где могли, заменили на \0, и \1.
>
> Есть часть данных, которые приходят от сторонних источников (чужое АПИ).
> Для этих данных делается decode, после чего они встраиваются в наши данные
> "as is". Среди "чужих" данных есть boolean. В какой-то момент начинаем
> ловить null в наших ответах вместо true/false.
>
>
> 2017-11-28 12:34 GMT+03:00 Pavel Zabolotniy via Moscow-pm <
> moscow-pm на pm.org>:
>
> Привет, moscow-pm!
> Кто-нибудь сталкивался с проблемой http://www.perlmonks.org/?
> node_id=1021294 ?
> Как ее решали?
>
> Спасибо!
>
> --
> #!/usr/bin/Regards,
> Pavel Zabolotniy
> email: tim на myrz.ru
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
>
>
>
>
> --
> #!/usr/bin/Regards,
> Pavel Zabolotniy
> email: tim на myrz.ru
>
> ,--
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
> --
> #!/usr/bin/Regards,
> Pavel Zabolotniy
> email: tim на myrz.ru
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20171128/17d3b17f/attachment.html>


Подробная информация о списке рассылки Moscow-pm