【问题标题】:DBIx to JSON - Wrong formatDBIx 转 JSON - 格式错误
【发布时间】:2019-04-02 09:43:32
【问题描述】:

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 无法解析的。它抱怨格式异常。

【问题讨论】:

  • 我认为您正在对数据进行双重编码。似乎其他方法(“stash”或“forward”,我不知道您的具体框架)正在为您编码整个对象,但您已经自己编码了其中的数据。因此,它所做的是将“祝福”对象的编码字符串包装在另一个 JSON 对象中,该对象中包含单个属性“json”,包含您的字符串。要解决的是,我希望您可以简单地编写 $c->stash(json => $c->stash->{books}); 而无需手动编码。
  • (我不写答案,因为我不知道你的框架,所以我不完全确定,我只是通过 json 标签提出这个问题。但这似乎合乎逻辑。所以如果它有效,请确认,我会写一个完整的答案。谢谢)。
  • 这是默认的 View::JSON 吗?那不应该吃json stash 键并只生成该键后面的数据结构作为输出吗?
  • 是的,它是默认的Catalyst::View::JSON,但是根本没有sub。
  • 而View::JSON的配置是'View::JSON' => { allow_callback => 1, callback_param => 'cb', expose_stash => [ qw(json) ], json_encoder_args = > +{utf8=>0}, }

标签: json perl catalyst dbix-class


【解决方案1】:

$json->convert_blessed->encode($c->stash->{books}) 返回一个字符串。看起来View::JSON 也编码了 json。

尝试按原样传递您的数据:$c->stash(json => $c->stash->{books});。您可能还需要配置 expose_stashjson_encoder_args 来处理存储中的正确键并正确转换对象。

https://metacpan.org/pod/Catalyst::View::JSON#CONFIG-VARIABLES

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 2016-10-28
    • 2018-11-09
    • 2014-12-02
    • 2020-05-11
    • 2022-07-22
    • 2012-02-29
    相关资源
    最近更新 更多