если для каких-то полей сериализуемой структуры всё же известно, что в них 
должно быть, то:
для строки: "$_"
для числа: $_+0

--
для json api обычно известно что он должен отдавать, иначе это не api, а что-то 
странноватое

On 10/13/2015 10:36 PM, Victor Efimov wrote:
> не, а если у тебя где-то по логике должна быть json-строка, но вот так
> совпала что в ней цифры..
> 
> 13 октября 2015 г., 22:33 пользователь vividsnow <[email protected]> 
> написал:
>> On 10/13/2015 10:20 PM, Victor Efimov wrote:
>>> 13 октября 2015 г., 22:18 пользователь vividsnow <[email protected]> 
>>> написал:
>>>> On 10/13/2015 07:49 PM, Olga Smirnova wrote:
>>>>> Ни за ни против типизации, просто пример, когда строгая типизация могла 
>>>>> бы решить проблему простым способом
>>>>>
>>>>> Примерно вот такой кусок кода:
>>>>>
>>>>> use JSON qw(to_json);
>>>>> use Data::Dumper;
>>>>>
>>>>> my $numbers = {
>>>>>     one => 1.5,
>>>>>     two => 2,
>>>>> };
>>>>> my $str = to_json( $numbers );
>>>>> print $str . "\n\n";
>>>>>
>>>>> my $str2 = Dumper($numbers);
>>>>> my $str3 = to_json( $numbers );
>>>>>
>>>>> print $str3 . "\n\n";
>>>>>
>>>>> Получаем вот такой вывод:
>>>>>
>>>>> {"one":1.5,"two":2}
>>>>>
>>>>> {"one":"1.5","two":2}
>>>>>
>>>>> Т.е. берем структуру с заведомыми чиселками, которую нужно преобразовать 
>>>>> в json, затем применяем к ней какую-нибудь функцию, в данном случае 
>>>>> Dumper, и теперь наша дробная
>>>>> чиселка легким движением руки превращается в строчечку при 
>>>>> json-сериализации. Если бы была строгая типизация, то такой проблемы бы 
>>>>> не возникло.
>>>>>
>>>>> Конкретно у нас это стало проблемой, когда понадобилось посылать внутри 
>>>>> json'а сумму в рублях (соответственно, это дробная чиселка), а на 
>>>>> принимающей стороне был сервис,
>>>>> написанный на скале (т.е. со строгой типизацей), валидатор которого 
>>>>> ругался на наши "1.5" и говорил, мол это не чиселка.
>>>>>
>>>>> Тут, конечно, можно сказать, мол, просто не используйте Dumper (или любую 
>>>>> другую функцию, неявно преобразующую тип), но это не панацея, т.к. в 
>>>>> любой момент в проект может
>>>>> прийти новый человек, не знающий про эту фичу, который возьмет да и 
>>>>> начнет использовать одну из таких функций перед отправкой и все нахрен 
>>>>> поломается.
>>>>> В нашем случае решением проблемы стал перевод единицы измерения суммы из 
>>>>> рублей в копейки и на нашей стороне и на принимающей (благо, принимающий 
>>>>> сервис тоже наш), т.е.
>>>>> избавление от дробных чисел - перед отправкой для суммы всегда делался 
>>>>> int и уже неважно было, что делали с этой чиселкой раньше.
>>>>
>>>> как вариант в функции-сериализаторе приводить значение к соотв. типу через:
>>>>
>>>> to_json({ one => $numbers->{one} +0, two => $numbers->{two} +0 })
>>>
>>> да, если функция сериализации знает какие поля будут числами, а какие - нет
>>
>> если нужно обобщенное решение, то можно "пробежаться" по структуре и:
>> $_+=0 if Scalar::Util::looks_like_number($_)
>>
>>>
>>>>
>>>> по этой теме на CPAN'е есть: https://metacpan.org/pod/JSON::Schema::Fit
>>>>
>>>>>
>>>>> С другой сторону, в пользу не строгой типизации - если бы такой json (с 
>>>>> "1.5") пришел в сервис, написанный на перле, то проблемы бы не было - мы 
>>>>> бы адекватно распарсили и
>>>>> 1.5 и "1.5"
>>>>>
>>>>>
>>>>> 13.10.2015 19:08, Victor Efimov пишет:
>>>>>> твой пример был про программиста, который написал $b='20' с кавычками, а 
>>>>>> потом решил с переменной $b произвести сложение. это не вменяемый 
>>>>>> программист, даже по
>>>>>> реальностям Perl5. он присваивает переменной заведомо строковое значение 
>>>>>> прямо в исходном коде, зачем-то пишет кавычки, а затем эту же переменную 
>>>>>> пытается складывать.
>>>>>> если у тебя какой-то xml парсер - то и приводи примеры xml парсера. я за 
>>>>>> то чтобы избавиться от абстракций в этом треде, тут и так полно 
>>>>>> недопонимания. так что лучше
>>>>>> пример кода обсужать а не на пальцах пытаться что-то объяснить и 
>>>>>> демагогией заниматься.
>>>>>
>>>>> --
>>>>> С уважением,
>>>>>
>>>>> Ольга Смирнова
>>>>> Perl-программист проекта Деньги@mail.ru
>>>>> раб.: +7 (495)-725-63-57 (внутр. 2199)
>>>>> моб.: +7 (926)-959-16-23
>>>>> e-mail: [email protected] <mailto:[email protected]>
>>>>> skype: olga_smirnova89
>>>>> mail-agent: [email protected]
>>>>> ISQ: 232733122
>>>>>
>>>>> mail.ru <http://mail.ru>
>>>>>
>>>>>
>>>> --
>>>> Moscow.pm mailing list
>>>> [email protected] | http://moscow.pm.org
>> --
>> Moscow.pm mailing list
>> [email protected] | http://moscow.pm.org
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить