【问题标题】:Making json to hash, then comparing this hash with another hash in perl [closed]使json散列,然后将此散列与perl中的另一个散列进行比较[关闭]
【发布时间】:2016-10-17 11:54:48
【问题描述】:

我有 2 个文件(json 文件和 pid 文件)。 json文件格式为:

{
 "connection": {
  "file": {
   "file_connection_1": {
    "CLOUD_AUTHENTICATION": "",
    "CLOUD_CONN_PROTOCOL": "",
    "CONN_NAME": "file_connection_1",
    "FILE_DIR": "/home/directory"
   }
  }
 }
}

pid 的格式:

<General>
 "CLOUD_AUTHENTICATION": "YES"
 "CLOUD_CONN_PROTOCOL": "PRTCL"
 "CONN_NAME": "file_connection_1"
 "FILE_DIR": "/home/directory"
</General>

我想将这两个文件都转换为哈希值,然后比较键的值(例如 CLOUD_AUTHENTICATION 或 CLOUD_CONN_PROTOCOL...)。从 pid 获取值并将它们插入到 json 文件哈希中(如果不存在)。 我能够将文件转换为哈希,但不清楚如何比较键并将值从 pid 哈希复制到 json 哈希。

【问题讨论】:

  • 在哪里和哪个............在你的问题中遗漏了这两点。 Where --> 服务器端或前端以及您使用的语言。
  • @Hema 根据标签和问题标题,OP正在使用Perl。
  • 您应该添加已有的代码。你如何将文件转换为哈希?生成的数据结构是什么样的?给他们看。您可以edit您的问题添加这些详细信息。

标签: json perl hash


【解决方案1】:

按照我理解问题的方式,您有两个具有相同键的哈希。如果第一个没有某个键的值,你想把另一个哈希的值放在那里。

因为您没有提供如何创建这些哈希,所以我想出了自己的解决方案。您可能可以忽略它。我使用Config::General 和一些技巧来摆脱": 来读取pid 文件,并使用JSON 来读取JSON。

use strict;
use warnings;
use Config::General;
use JSON 'decode_json';
use Data::Dumper;

# read the pid file
my %cfg_pid = Config::General->new(
    -NormalizeOption => sub { my $x = shift; $x =~ s/^"|":$//g; $x; }, 
    -NormalizeValue  => sub { my $x = shift; $x =~ s/^"|"$//g; $x },
    -ConfigFile      => \*DATA
)->getall;

# read the json file
my $json = <<'JSON';
{
 "connection": {
  "file": {
   "file_connection_1": {
    "CLOUD_AUTHENTICATION": "",
    "CLOUD_CONN_PROTOCOL": "",
    "CONN_NAME": "file_connection_1",
    "FILE_DIR": "/home/directory"
   }
  }
 }
}
JSON

my $cfg_json = decode_json($json);

# this is before
print Dumper $cfg_json;

# actual part that you want
foreach my $key ( keys %{ $cfg_pid{General} } ) {
    $cfg_json->{connection}->{file}->{file_connection_1}->{$key} = $cfg_pid{General}->{$key}
        unless $cfg_json->{connection}->{file}->{file_connection_1}->{$key};
}

# and this is after
print Dumper $cfg_json;

__DATA__
<General>
 "CLOUD_AUTHENTICATION": "YES"
 "CLOUD_CONN_PROTOCOL": "PRTCL"
 "CONN_NAME": "file_connection_1"
 "FILE_DIR": "/home/directory"
</General>

它真正做的只是迭代 pid 文件散列的键,并检查 json 散列是否存在该键的值。如果该值不为真(这意味着键不存在,值为undef,空字符串q{}0),它会将其设置为pid 文件哈希的值。当然,您也可以显式检查空字符串。

输出如下。

$VAR1 = {
    'connection' => {
        'file' => {
            'file_connection_1' => {
                'FILE_DIR'             => '/home/directory',
                'CONN_NAME'            => 'file_connection_1',
                'CLOUD_CONN_PROTOCOL'  => '',
                'CLOUD_AUTHENTICATION' => ''
            }
        }
    }
};
$VAR1 = {
    'connection' => {
        'file' => {
            'file_connection_1' => {
                'FILE_DIR'             => '/home/directory',
                'CONN_NAME'            => 'file_connection_1',
                'CLOUD_CONN_PROTOCOL'  => 'PRTCL',
                'CLOUD_AUTHENTICATION' => 'YES'
            }
        }
    }
};

【讨论】:

  • 谢谢@simbabque。我以与您相同的方式将文件转换为哈希。对不起,我没有给你提供代码。您的答案似乎给出了正确的结果,但我不想对这些值进行硬编码。我刚刚给了你json的一部分。我正在使用的 json 包含 5-10 个类别,例如“连接”,然后是不同的子类别。我无法对所有类别进行硬编码。另外,我正在考虑比较从 pid 到 json 的键,当它匹配时,然后获取值。我不知道如何比较不同结构化哈希的键。
  • 另外,我们可以检查这段代码:$cfg_json-&gt;{connection}-&gt;{file}-&gt;{file_connection_1}-&gt;{$key} 如果 $key 之前的值(哈希引用名称)等于 'file_connection_1' 或倒数第二个值(哈希引用名称)等于 'file' ?
  • @JustStarted 请更新您的问题并在两个文件中包含第二个类别。您没有提到类别是动态的。我不明白你的第二条评论是什么意思。尝试用不同的方式说出来。
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2011-03-13
  • 2011-05-08
  • 2014-07-27
相关资源
最近更新 更多