[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