Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl、JSON解析值不正确_Json_Perl - Fatal编程技术网

Perl、JSON解析值不正确

Perl、JSON解析值不正确,json,perl,Json,Perl,我正在解析存储在数据库中的JSON字符串 {姓名:西蒙,年龄:23岁,身高:高} 我提取数据,然后解码。运行下面的代码时,我收到了奇怪的“哈希”值 use JSON; $data = decode_json($row->{'address'}); for my $key (keys %$data){ if($data->{$key} ne ''){ $XML .= " <$key>$data->{$key}&l

我正在解析存储在数据库中的JSON字符串

{姓名:西蒙,年龄:23岁,身高:高}

我提取数据,然后解码。运行下面的代码时,我收到了奇怪的“哈希”值

use JSON;

$data = decode_json($row->{'address'});
for my $key (keys %$data){
       if($data->{$key} ne ''){
               $XML .= "      <$key>$data->{$key}</$key>";
       }
}

// Returns data like so 

<company_type>HASH(0x27dbac0)</company_type>
<county>HASH(0x27db7c0)</county>
<address1>HASH(0x27dba90)</address1>
<company_name>HASH(0x27db808)</company_name>
当我有这样一个数据集时会发生错误:

{姓名:,年龄:{},身高:{}


我不明白为什么在Perl中使用JSON/array/hash会如此困难。我遗漏了哪一点?

您正在处理一个平面散列,而您的数据实际上有另一个嵌套的hashref。排队

{ "name":"", "age":{}, "height":{} }
{}的意思可能不是别的,实际上是下一级嵌套数据,实际上是空的。在Perl中,我们得到一个hashref,这就是您的代码打印的内容

JSON的另一个支柱是数组,在Perl中我们得到一个arrayref。也就是说-decode_json返回了顶级hashref,当它被解引用到散列中时,可能会包含更多的散列或数组引用作为值。如果你打印整个结构,你会看到

为了解决这个问题,我们必须每次测试一个参考。由于取消引用的散列或数组可能包含更多级别的引用,因此我们需要使用递归例程(参见示例)或复杂数据结构的模块。但是对于第一级

for my $key (keys %$data)
{
    next if $data->{$key} eq '';

    my $ref_type = ref $data->{$key};

    # if $data->{key} is not a reference ref() returns an empty string (false)
    if (not $ref_type) {
        $XML .= "      <$key>$data->{$key}</$key>";
    }
    elsif ($ref_type eq 'HASH') {
        # hashref,  unpack and parse. it may contain references
        say "$_ => $data->{$key}{$_}" for keys %{ $data->{$key} };
    }
    elsif ($ref_type eq 'ARRAY') {
        # arrayref, unpack and parse. it may contain references
        say "@{$data->{$key}}";
    }
    else { say "Reference is to type: $ref_type" }
}
如果的参数不是引用,而是字符串或数字引用,则返回一个空字符串,该字符串的计算结果为false,即当您有纯数据时。否则,它将返回引用的类型。它可以是散列或数组。这就是嵌套是如何完成的


在所示的示例中,您正在运行hashref。因为您显示的是空的,所以您可以丢弃它们,并且特定示例的代码可以大大减少为一条语句。但是,我会保留其他测试。这也应该适用于发布的示例。

您正在处理一个平面散列,而您的数据实际上有另一个嵌套的hashref。排队

{ "name":"", "age":{}, "height":{} }
{}的意思可能不是别的,实际上是下一级嵌套数据,实际上是空的。在Perl中,我们得到一个hashref,这就是您的代码打印的内容

JSON的另一个支柱是数组,在Perl中我们得到一个arrayref。也就是说-decode_json返回了顶级hashref,当它被解引用到散列中时,可能会包含更多的散列或数组引用作为值。如果你打印整个结构,你会看到

为了解决这个问题,我们必须每次测试一个参考。由于取消引用的散列或数组可能包含更多级别的引用,因此我们需要使用递归例程(参见示例)或复杂数据结构的模块。但是对于第一级

for my $key (keys %$data)
{
    next if $data->{$key} eq '';

    my $ref_type = ref $data->{$key};

    # if $data->{key} is not a reference ref() returns an empty string (false)
    if (not $ref_type) {
        $XML .= "      <$key>$data->{$key}</$key>";
    }
    elsif ($ref_type eq 'HASH') {
        # hashref,  unpack and parse. it may contain references
        say "$_ => $data->{$key}{$_}" for keys %{ $data->{$key} };
    }
    elsif ($ref_type eq 'ARRAY') {
        # arrayref, unpack and parse. it may contain references
        say "@{$data->{$key}}";
    }
    else { say "Reference is to type: $ref_type" }
}
如果的参数不是引用,而是字符串或数字引用,则返回一个空字符串,该字符串的计算结果为false,即当您有纯数据时。否则,它将返回引用的类型。它可以是散列或数组。这就是嵌套是如何完成的


在所示的示例中,您正在运行hashref。因为您显示的是空的,所以您可以丢弃它们,并且特定示例的代码可以大大减少为一条语句。但是,我会保留其他测试。这也应该适用于所发布的示例。

JSON使用什么perl模块?JSON模块!使用JSON。它是debian服务器您是否尝试使用use data::Dumper打印Dumper$数据?这对我来说很好。哦,我明白你的意思。这不是一个错误。在这行中,您显示的年龄和身高的值为。。。哈希引用,用于另一个空嵌套级别。它可能意味着什么都没有,但它实际上是嵌套数据,但却是空的。所以,当您手工迭代它时,如果您只是打印它,您会得到哈希0x…,作为哈希引用。用Data::Dumper打印出来,您会发现它很好。当你手工操作的时候,你会有一个额外的层次。在Perl中使用它们并不困难——相反,JSON是传递数据的最干净的方法之一,Perl有一个简单而好的支持。问题可能是缺少一点,在解析JSON之后,您会返回一个复杂的嵌套数据结构,而您不知道其中包含什么。这取决于你正在做的事情的性质,加载一些数据。在任何语言中都是一样的。所以你需要审问一下。使用Data::Dumper查看它,或者盲目解析嵌套的哈希/数组。我在回答中指出了这一点,让我知道更多是否有用。JSON使用什么perl模块?JSON模块!使用JSON。它是debian服务器您是否尝试使用use data::Dumper打印Dumper$数据?这对我来说很好。哦,我明白你的意思。这不是一个错误。在这行中,您显示的年龄和身高的值为。。。哈希引用,用于另一个空嵌套级别。它可能意味着什么都没有,但它实际上是嵌套数据,但却是空的。 所以,当您手工迭代它时,如果您只是打印它,您会得到哈希0x…,作为哈希引用。用Data::Dumper打印出来,您会发现它很好。当你手工操作的时候,你会有一个额外的层次。在Perl中使用它们并不困难——相反,JSON是传递数据的最干净的方法之一,Perl有一个简单而好的支持。问题可能是缺少一点,在解析JSON之后,您会返回一个复杂的嵌套数据结构,而您不知道其中包含什么。这取决于你正在做的事情的性质,加载一些数据。在任何语言中都是一样的。所以你需要审问一下。使用Data::Dumper查看它,或者盲目解析嵌套的哈希/数组。我在回答中指出了这一点,让我知道更多是否有用。