gpt4 book ai didi

json - Perl 处理后向 JSON 数据添加内容

转载 作者:行者123 更新时间:2023-12-02 09:03:32 26 4
gpt4 key购买 nike

我有一个 json 文件,我正在使用 perl JSON 处理它模块。

一旦我处理它,我想在其中插入一些内容。

这是我的输入 json 文件:

{
"sequence" : [
{
"type" : "event",
"attribute" : {
"contentText" : "Test Content",
"contentNumber" : "11"
}
}
],
"current" : 0,
"next" : 1
}

下面是我的脚本:
#!/usr/bin/perl

use strict;
use warnings;

use JSON;
use Data::Dumper;

my $needed = 2;
my $filename = "test_file.json";

my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename)
or die("Can't open \$filename\": $!\n");
local $/;
<$json_fh>
};

my $json = JSON->new;
my $data = $json->decode($json_text);

my $aref = $data->{sequence};

print Dumper($aref);

my $number;

for my $element (@$aref) {
$number = $element->{attribute}->{contentNumber}."\n";
}

print "Number:$number\n";

my $total = $number + $needed;

foreach my $each_number ($number+1..$total){
print $each_number."\n";
}

print Dumper $data;

所以我在这里需要的是 fetch contentNumber从给定的 json 文件并将值递增 1 直到 $needed被提及并形成一个新的json文件。

最后它应该形成 JSON 文件,其内容如下:
随便 $needed变量值提到很多时候json应该形成包括初始数据的数据。
{
"sequence" : [
{
"type" : "event",
"attribute" : {
"contentText" : "Test Content",
"contentNumber" : "11"
}
},
{
"type" : "event",
"attribute" : {
"contentText" : "Test Content",
"contentNumber" : "12"
}
},
{
"type" : "event",
"attribute" : {
"contentText" : "Test Content",
"contentNumber" : "13"
}
}
],
"current" : 0,
"next" : 1
}

我正在考虑将数据推送到 foreach环形。但不知道我们如何将它放在数据对象中,它应该给我一个 json 格式的输出。

最佳答案

从所需的输出看来,您需要 sequence 中的 hashref的数组。然后你需要添加$needed到该数组的副本数,contentNumber在每个递增。 (我无法将其与显示的代码相协调,我将使用所需的输出,这似乎很清楚。)
不要忘记副本必须是深副本;†这里我使用dclone来自 Storable为了那个原因。

use Storable qw(dclone);

...

my $seq_href = dclone( $data->{sequence}[0] );

for (1..$needed) {
++$seq_href->{attribute}{contentNumber};
push @{$data->{sequence}}, dclone( $seq_href );
}

my $new_json_string = $json->encode($data); # then write it to file
这会在我的测试中生成所需的输出 JSON。

† 包含引用的变量或数据结构不能仅通过赋值复制到一个新的、独立的
my @copy = @ary;   # oups ... any references in there?
问题是当 @ary 中引用的元素时被复制到 @copy那么 @copy 中的那些元素,作为相同的引用,指向与 @ary 中的相同的内存位置!所以 @copy@ary绝不是独立的——它们共享数据。
有时这可能是需要的,但如果我们需要一个独立的副本,就像在这个问题中一样,那么我们需要一直遵循这些引用并实际复制数据,以便复制的结构确实有自己的数据。当然,有些模块可以做到这一点。
根据定义,复杂(嵌套)数据结构具有元素的引用,因此我们当然不能通过一个顶级分配获得独立的副本。
这是对潜在的偷偷摸摸和微妙的错误的非常简单的描述。我建议阅读更多内容。出现的一种资源是 Effective Perler article .

关于json - Perl 处理后向 JSON 数据添加内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61116196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com