DBIx в JSON - неправильный формат - PullRequest
0 голосов
/ 29 октября 2018

В приложении Catalyst мне нужно сгенерировать JSON из DBIx :: Class: Core объектов.

Такое определение класса выглядит так:

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. Он жалуется на исключение формата.

1 Ответ

0 голосов
/ 29 октября 2018

$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

...