Как безопасно перейти с JSON 1 на JSON 2 со строками utf8? - PullRequest
5 голосов
/ 05 октября 2011

У нас есть большая кодовая база, которая широко использует API JSON v1:

use JSON;
my $json = objToJson($data);
my $data = jsonToObj($json);

Мы хотели бы перейти на JSON v2, чтобы мы могли начать использовать его в новом коде, а также потому, что мы сталкивались с другими модулями, которые зависят от v2 API .

Однако, если я сохранил строку utf8, созданную objToJson(), она больше не будет декодироваться таким же образом с помощью JSON :: XS (именно это JSON v2 использует за кулисами ).

use JSON;
use JSON::XS;
use warnings;
use strict;

my $data    = ["\x{263a}b"];
my $encoded = JSON::objToJson($data);
print "different!\n"
  unless JSON::jsonToObj($encoded)->[0] eq JSON::XS::decode_json($encoded)->[0];
print "different!\n"
  unless JSON::jsonToObj($encoded)->[0] eq JSON::XS->new->decode($encoded)->[0];

Есть ли какой-нибудь способ для нас перейти на JSON v2, но все же оставить API v1 для обратной совместимости с существующим кодом?

1 Ответ

1 голос
/ 05 октября 2011

Модули должны использовать новое имя, когда они делают такие радикальные изменения. В этом случае тот факт, что JSON 2.x в основном является оболочкой для JSON :: XS, удобно означает, что они так и сделали.

Я рекомендую:

  1. Оставьте JSON 1.x установленным.
  2. Установить JSON :: XS.
  3. На досуге конвертируйте из JSON 1.x в JSON :: XS.
  4. Теперь можно безопасно обновиться до JSON 2.x, если хотите.
    1. Установить JSON 2.x
    2. s / JSON :: XS / JSON / г
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...