解码JSON字符串在Mojolicious是用JSON.stringify编码

Decode JSON string in Mojolicious that was encoded with JSON.stringify

本文关键字:JSON stringify 编码 是用 字符串 解码 Mojolicious      更新时间:2023-09-26

我正试图将javascript变量作为JSON字符串发送到Mojolicious,我在perl方面解码它有问题。我的页面使用utf-8编码。

json字符串($self->param('routes_jsonstr')的值)似乎有正确的值,但Mojo::JSON无法解码。当没有utf-8字符时,代码运行良好。我做错了什么?

Javascript代码:

        var routes = [ {
            addr1: 'Škofja Loka', // string with utf-8 character
            addr2: 'Kranj'
        }];
        var routes_jsonstr = JSON.stringify(routes);
        $.get(url.on_route_change,
            {
                routes_jsonstr: routes_jsonstr
            }
        );
Perl代码:

sub on_route_change {
    my $self = shift;
    my $routes=j( $self->param('routes_jsonstr') );
    warn $self->param('routes_jsonstr');
    warn Dumper $routes;
}

服务器输出
Wide character in warn at /opt/mojo/routes/script/../lib/Routes/Homepage.pm line 76. 
[{"addr1":"Škofja Loka","addr2":"Kranj"}] at /opt/mojo/routes/script/../lib/Routes/Homepage.pm line 76. 
$VAR1 = undef;

上面的最后一行显示json字符串的解码不起作用。当perl端没有utf-8字符解码时,一切工作正常,$routes包含预期的数据。

Mojolicious style解决方案如下:http://showmetheco.de/articles/2010/10/how-to-avoid-unicode-pitfalls-in-mojolicious.html

在Javascript中,我只将$.get()更改为$.post()。更新后的Perl代码现在看起来像这样:
use Mojo::ByteStream 'b';
sub on_route_change {
    my $self = shift;    
    my $routes=j( b( $self->param('routes_jsonstr') )->encode('UTF-8') );
}

测试了许多不同的utf8字符串

打印时会出现宽字符警告。这不是由于您解码unicode的方式,而是由于您的STDOUT编码。试试CPAN中可用的use utf8::all,它会将所有IO句柄设置为utf8。避免解码可能并不能解决问题,反而会使问题变得更糟。它看起来工作的唯一原因是您的终端正在为您解决问题。

通过转义有问题的字符,至少可以减轻一些痛苦;参见https://stackoverflow.com/a/4901205/17389。