在 Catalyst 应用程序中,我需要从 DBIx :: Class:Core 对象生成 JSON 。
这样的类定义如下:
use utf8;
package My::Schema::Book;
use strict;
use warnings;
use Moose;
use MooseX::NonMoose;
use MooseX::MarkAsMethods autoclean => 1;
extends 'DBIx::Class::Core';
__PACKAGE__->load_components("InflateColumn::DateTime");
__PACKAGE__->table("books");
__PACKAGE__->add_columns(
"id",
{
data_type => "uuid",
default_value => \"uuid_generate_v4()",
is_nullable => 0,
size => 16,
},
"title"
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->meta->make_immutable;
sub TO_JSON {
my $self = shift;
{book => {
id => $self->id,
title => $self->title,
}}
}
1;
从数据库中查询书籍之后,我对祝福对象进行编码:
$c->stash(books_rs => $c->model('My::Schema::Book'));
$c->stash(books => [$c->stash->{books_rs}->search(
{},
{order_by => 'title ASC'})]
);
$c->stash(json => $json->convert_blessed->encode($c->stash->{books}));
$c->forward('View::JSON');
查询的JSON输出是这样的:
{"json":"[{\"book\":{\"id\":\"ae355346-8e19-46ee-88ee-773ac30938a9\",\"title\":\"TITLE1\"}},{\"book\":{\"id\":\"9a20f526-d4cd-4e7d-a726-55e78bc3c0ac\",\"title\":\"TITLE2\"}},{\"book\":{\"title\":\"TITLE3\",\"id\":\"1ddb2d27-3ec6-46c1-a1a7-0b151fe44597\"}}]"}
json 键的值和每个特定的书键都有双引号,而jQuery无法解析。它抱怨格式异常。
答案 0 :(得分:1)
$json->convert_blessed->encode($c->stash->{books})
返回一个字符串。看来View::JSON
也可以编码json。
尝试按原样传递数据:$c->stash(json => $c->stash->{books});
。您可能还需要配置expose_stash
和json_encoder_args
以便从存储中处理正确的键并正确转换对象。
请参阅 https://metacpan.org/pod/Catalyst::View::JSON#CONFIG-VARIABLES