<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>