【问题标题】:JSON from array prints invalid json来自数组的 JSON 打印无效的 json
【发布时间】:2021-10-10 06:24:35
【问题描述】:

我一直在使用一个脚本,用户将在其中输入搜索字符串,然后它将返回搜索结果 json。然而,我不得不进行更改,让脚本在表格中搜索数据并打印json 结果。我创建了一个 for 循环来执行此任务。 (发布了 for 循环的示例,这是此处唯一相关的部分):

#!/bin/perl
use strict;
use warnings;
use JSON;
$json = JSON->new->allow_nonref;
...
foreach (...) {
      my $object = {name => "$name", surname => "$surname", age => "$age"}, 'response';
      my $result = $json->encode($object);
      print "$result";
  }

这完全符合它的用途,并以有效的json 格式打印每个元素(手动使其漂亮):

{
   "name" : "Sarah",
   "surname" : "O'Conner",
   "age" : "89"
}
{
   "name" : "John",
   "surname" : "Smith",
   "age" : "32"
}

问题是每个json 元素都有效,但作为多个根元素无效。我需要这个:

[
   {
      "name":"Sarah",
      "surname":"O'Conner",
      "age":"89"
   },
   {
      "name":"John",
      "surname":"Smith",
      "age":"32"
   }
]

我尝试了 20 种不同的方法,但我无法解决这个问题。谁能帮我解决这个问题?如何将结果作为多个根元素和单独的元素?

【问题讨论】:

  • 构建一个 hashref 数组并对它的引用进行编码?
  • 另外,为什么需要运行bless
  • @Shawn,感谢您的回复。我需要了解如何做到这一点。
  • @choroba。老实说,我不知道,我只使用了 metacpan 页面中的一个示例,它适用于单个 json 结果。
  • @choroba,谢谢,我将代码修改为不再是 bless。现在只是想弄清楚如何获得所需的结果。

标签: json perl


【解决方案1】:

您在流程的错误点进行 JSON 转换。您应该创建一个记录数组并进行转换,而不是转换每个单独的记录。

#!/bin/perl
use strict;
use warnings;
use JSON;
$json = JSON->new->allow_nonref;
...
my @objects;

foreach (...) {
      my $object = {name => "$name", surname => "$surname", age => "$age"};
      push @objects, $object;
}

my $result = $json->encode(\@objects);
print "$result";

【讨论】:

  • 还有一个悬空的, 'response' -- 可能是因为删除了bless()
  • @JimDavis:谢谢。现已修复。
【解决方案2】:

创建一个“对象”数组(在 Perl 中称为 hashes)并对其进行编码:

my @objects;
foreach (...) {
      push @objects, {name => $name, surname => $surname, age => $age};
}
my $result = $json->encode(\@objects);
print $result;

如果您向我们展示 ... 部分,我们可能会向您展示如何将其直接转换为 @objects 而无需推送(例如,使用 map)。

顺便说一句,不需要双引号变量。

【讨论】:

  • 感谢磨坊。另请参阅我对@DaveCross 的评论。那么关于您回答中的foreach (...) 问题。在我的实际代码中,我实际上从各种 for 循环中获取信息,这些循环从不同的应用程序 API 和 DB 表中获取结果。因此,这些方法将派生自一些命令,然后将数据推送到数组并在运行结束时打印整个结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2013-07-11
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多