【问题标题】:How to add content to dynamic nested JSON with Perl script如何使用 Perl 脚本向动态嵌套 JSON 添加内容
【发布时间】:2018-08-05 13:30:00
【问题描述】:

您好,我必须动态地向现有 JSON 数组添加一些新的内容数组。我有一个这样的 JSON:

{
  "deal": {
    "distributionWindows": [
      {
        "availableAt": "2016-10-08T23:00:00Z",
        "availableUntil": "2016-10-09T23:00:00Z",
        "constraints": [
          {
            "categoryIds": [
              "1760gh81-5m83-4b16-a2c5-6ed511f35d9a",
              "09f78fg9-2728-4nl1-a601-c5176744d534"
            ],
            "enforcedAt": "2016-10-08T23:00:00Z",
            "enforcedUntil": "2016-10-09T23:00:00Z",
            "type": "forbidden"
          }
        ],
        "enabled": false,
        "type": "prefeature"
      },
      {
        "availableAt": "2016-10-09T23:00:00Z",
        "availableUntil": "2016-12-12T21:44:23Z",
        "constraints": [
          {
            "categoryIds": [
              "1324kj81-5e89-4b16-a1u5-6uy511f35d9a",
              "1234nhgt-2728-4ac1-a601-c5176744d534"
            ],
            "enforcedAt": "2016-11-09T23:00:00Z",
            "enforcedUntil": "2016-12-12T22:59:59Z",
            "type": "forbidden"
          }
        ],
        "enabled": false,
        "type": "featured"
      }
    ],
    "inviteOnly": true,
    "wowDeal": true
  }
}

对于这个 JSON,我必须为每个约束添加新内容,最后 JSON 应该如下所示:

{
  "deal": {
    "distributionWindows": [
      {
        "availableAt": "2016-10-08T23:00:00Z",
        "availableUntil": "2016-10-09T23:00:00Z",
        "constraints": [
          {
            "categoryIds": [
              "1760gh81-5m83-4b16-a2c5-6ed511f35d9a",
              "09f78fg9-2728-4nl1-a601-c5176744d534"
            ],
            "enforcedAt": "2016-10-08T23:00:00Z",
            "enforcedUntil": "2016-10-09T23:00:00Z",
            "type": "forbidden"
          },
          {
            "categoryIds": [
              “9fiu8908-7d78-22e4-a228-7403453512e8"
            ],
            "enforcedAt": "2016-10-08T23:00:00Z",
            "enforcedUntil": "2016-10-09T23:00:00Z",
            "type": "allowed"
          }
        ],
        "enabled": false,
        "type": "prefeature"
      },
      {
        "availableAt": "2016-10-09T23:00:00Z",
        "availableUntil": "2016-12-12T21:44:23Z",
        "constraints": [
          {
            "categoryIds": [
              "1324kj81-5e89-4b16-a1u5-6uy511f35d9a",
              "1234nhgt-2728-4ac1-a601-c5176744d534"
            ],
            "enforcedAt": "2016-11-09T23:00:00Z",
            "enforcedUntil": "2016-12-12T22:59:59Z",
            "type": "forbidden"
          },
          {
            "categoryIds": [
              “9fiu8908-7d78-22e4-a228-7403453512e8"
            ],
            "enforcedAt": "2016-10-08T23:00:00Z",
            "enforcedUntil": "2016-10-09T23:00:00Z",
            "type": "allowed"
          }
        ],
        "enabled": false,
        "type": "featured"
      }
    ],
    "inviteOnly": true,
    "wowDeal": true
  }
}

如何使用 perl 做到这一点?如何动态循环并添加最后一个约束?我可以提取值,但我不确定如何将它循环到 JSON 数组并在中间添加内容。主要问题是它是动态的,有时它可能在现有 JSON 中有一个约束数组,有时它可能有 2 或 3 个。但我必须在每个分布窗口的末尾添加我的新约束。

【问题讨论】:

  • 你能展示一下你为解决它所做的工作吗??
  • @AkhileshAwasthi 我的 $json_array = decode_json($json); foreach my $item($json_array) { print $item->{deal}->{distributionWindows}[0]{constraints}[0]{categoryIds}[0];打印“\n”;打印 $item->{deal}->{distributionWindows}[0]{constraints}[0]{categoryIds}[1];打印“\n”; print print $item->{deal}->{distributionWindows}[0]{constraints};我是这个 perl 的新手,不知道该怎么做?

标签: json perl loops multidimensional-array


【解决方案1】:

这个怎么样?

sub process_window($)
{
   my($window) = @_;
   my $constraints = $window->{constraints};

   my $new_constraint;
   # your code that decides if constraint needs to be added goes here...

   # update constraints in window
   push(@{ $constraints }, $new_constraint);
}

my $data = decode_json($json);
foreach my $distWindow (@{ $data->{deal}->{DistributionWindows} }) {
    process_window($distWindow);
}
my $new_json = encode_json($data);

【讨论】:

  • 谢谢斯特凡。它正在用于插入数组。但是对于全新的内容,会添加额外的双引号,并且还会添加内容的反斜杠。添加的内容是这样的:constraints": [ { "type": "forbidden", "categoryIds": [ "1560ef81-5e83-4b16-a1d5-6de511f35d9a", "09d96db9-2728-4ac1-a601-c5176744d534" ], " enforcedUntil": "2017-11-09T23:00:00Z", "enforcedAt": "2017-11-08T23:00:00Z" }, "{\"categoryIds\": [\"0c5401a4-7d96-44f8-a229 -7403453512e8\"]}"
  • @Nagesh 这只能意味着您的字符串本身包含"(引号)。请比较 perl -MJSON -e '$k = "test"; $d{$k}++; print encode_json(\%d), "\n";' -> {"test":1}perl -MJSON -e '$k = "\"test\""; $d{$k}++; print encode_json(\%d), "\n";' -> {"\"test\"":1}
  • @Nagesh 如果传入了转换为哈希键的字符串,那么我会检查并添加一个引号剥离器,例如也许这个简单的对于您的用例已经足够了:$key =~ s/"//g;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多