<div dir="ltr"><div>Можно посмотреть на ошибку в следующем скрипте:<br>======================<br>use strict;<br>use threads;<br><br>my $s = "[40, true]";<br><br>sub start_thread {<br> require JSON::XS;<br> my $json = JSON::XS->new();<br> $json->convert_blessed(1);<br> $json->allow_blessed(1);<br> my $x = $json->decode($s);<br> for my $k (0..1){<br> print "Th(@_, $k)\n";<br> ++$x->[0];<br> say $json->encode($x);<br> sleep 1;<br> }<br>}<br><br>sub main{<br> my @argv = @_;<br> my @thr;<br> for my $i (1..2){<br> push @thr, threads->create(\&start_thread, "i=$i");<br> }<br> for my $t (@thr){<br> $t->join();<br> }<br><br>};<br><br>main(@ARGV);<br>===================================<br><br></div>Он выводит в одном потоке [*, true], а в другом [*,null], типа такого<br>====================<br><div>Th(i=2, 0)<br>Th(i=1, 0)<br>[41,true]<br>[41,null]<br>Th(i=1, 1)<br>Th(i=2, 1)<br>[42,null]<br>[42,true]<br><br>===================================</div><div><br></div><div>C помощью патча на JSON::XS <br></div><div>===================================</div><div>diff --git a/XS.xs b/XS.xs<br>index 9c9c3cf..a96f0bf 100644<br>--- a/XS.xs<br>+++ b/XS.xs<br>@@ -775,8 +775,18 @@ encode_rv (enc_t *enc, SV *sv)<br> if (expect_false (SvOBJECT (sv)))<br> {<br> HV *stash = SvSTASH (sv);<br>+ bool is_perl_bool = 0;<br>+ char *class_name = HvNAME(stash);<br>+ if (class_name[0] == 'J'){<br>+ if (strcmp(class_name, "JSON::PP::Boolean") == 0){<br>+ ++is_perl_bool;<br>+ }<br>+ else if (strcmp(class_name, "JSON::XS::Boolean") == 0){<br>+ ++is_perl_bool;<br>+ }<br>+ }<br><br>- if (stash == bool_stash)<br>+ if (is_perl_bool)<br> {<br> if (SvIV (sv))<br> encode_str (enc, "true", 4, 0);<br>============================</div><div><br></div><div><br></div><div>Вывод исправляется на валидный <br></div><div>========================</div><div>Th(i=1, 0)<br>[41,true]<br>Th(i=2, 0)<br>[41,true]<br>Th(i=1, 1)<br>[42,true]<br>Th(i=2, 1)<br>[42,true]<br>=========================<br></div><div><br></div><div>Надеюсь это та ошибка, о которой пишет топикстартер.<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">28 ноября 2017 г., 20:31 пользователь KES via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>JSON запрос, который пришел и в котором возникла указанная ошибка</div><div><br></div><div><br></div><div>28.11.2017, 15:30, "Pavel Zabolotniy" <<a href="mailto:tim@myrz.ru" target="_blank">tim@myrz.ru</a>>:</div><div class="HOEnZb"><div class="h5"><blockquote type="cite">
<div text="#000000" bgcolor="#FFFFFF">
<p><br>
</p>
<br>
<div>28.11.2017 16:04, KES пишет:<br>
</div>
<blockquote type="cite">
<div>А дампа исходного запроса нет, где словили null?</div>
<div> </div>
</blockquote>
<br>
Что подразумевается под дампом? Может сможем сделать.<br>
<br>
<blockquote type="cite">
<div>28.11.2017, 14:24, "Pavel Zabolotniy via Moscow-pm"
<a href="mailto:moscow-pm@pm.org" target="_blank"><moscow-pm@pm.org></a>:</div>
<blockquote type="cite">
<div bgcolor="#FFFFFF">
<div>28.11.2017 14:57, Толян II via Moscow-pm пишет:</div>
<blockquote type="cite">
<div>
<div>
<div>
<div>Прямо с такой нет, но boolean несколько граблей
было собрано, и мне пришлось заменить JSON::true и
JSON::false на \0, и \1 в конфигурации \(my $s=1) и
\(my $s=0).</div>
Возможно тебе это поможет.<br>
</div>
А у тебя такая проблема возникла или ты просто
спрашиваешь?<br>
</div>
</div>
<div> </div>
</blockquote>
<br>
Да, такая проблема воникла.<br>
Там, где могли, заменили на \0, и \1.<br>
<br>
Есть часть данных, которые приходят от сторонних источников
(чужое АПИ). Для этих данных делается decode, после чего они
встраиваются в наши данные "as is". Среди "чужих" данных есть
boolean. В какой-то момент начинаем ловить null в наших
ответах вместо true/false.<br>
<blockquote type="cite">
<div>
<div><span><span>2017-11-28 12</span></span>:34 GMT+03:00 Pavel
Zabolotniy via Moscow-pm <span><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span>:
<blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex">Привет, moscow-pm!<br>
Кто-нибудь сталкивался с проблемой <a href="http://www.perlmonks.org/?node_id=1021294" target="_blank">http://www.perlmonks.org/?<wbr>node_id=1021294</a>
?<br>
Как ее решали?<br>
<br>
Спасибо!<br>
<br>
<span><font color="#888888">--<br>
#!/usr/bin/Regards,<br>
Pavel Zabolotniy<br>
email: <a href="mailto:tim@myrz.ru" target="_blank">tim@myrz.ru</a><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" target="_blank">http://moscow.pm.org</a></font></span></blockquote>
</div>
</div>
<br>
</blockquote>
<pre>--
#!/usr/bin/Regards,
Pavel Zabolotniy
email: <a href="mailto:tim@myrz.ru" target="_blank">tim@myrz.ru</a></pre>
</div>
,<span>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>
| <a href="http://moscow.pm.org/" target="_blank">http://moscow.pm.org</a></span></blockquote>
</blockquote>
<br>
<pre cols="72">--
#!/usr/bin/Regards,
Pavel Zabolotniy
email: <a href="mailto:tim@myrz.ru" target="_blank">tim@myrz.ru</a></pre>
</div>
</blockquote>
</div></div><br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div>