访问已解码的JSON数据结构

时间:2018-02-23 14:13:18

标签: arrays json perl

我正在尝试使用Perl

从此JSON中提取特定条目
{
    "sentences": [
        {
            "index": 0,
            "tokens": [
                {
                    "index":                1,
                    "word":                 "盧旺達",
                    "originalText":         "盧旺達",
                    "lemma":                "盧旺達",
                    "characterOffsetBegin": 0,
                    "characterOffsetEnd":   3,
                    "pos":                  "NN",
                    "ner":                  "PERSON"
                },
                {
                    "index":                2,
                    "word":                 "援助",
                    "originalText":         "援助",
                    "lemma":                "援助",
                    "characterOffsetBegin": 3,
                    "characterOffsetEnd":   5,
                    "pos":                  "NN",
                    "ner":                  "O"
                }
            ]
        }
    ]
}

我想访问tokens然后访问ner,我一直在尝试使用此代码,但它不会返回任何内容

$json = decode_json $json_string;

my $tokens = $json->{"sentences"}->{"tokens"};

print Dumper(\$tokens);

2 个答案:

答案 0 :(得分:3)

#!/usr/bin/env perl

use v5.24; # why not?!
use utf8;
use strict;
use warnings;

use open qw(:std utf8);

use JSON::MaybeXS qw( decode_json );

my $json = "...";

my $x = decode_json $json;

for my $sentence ($x->{sentences}->@*) {
    for my $token ($sentence->{tokens}->@*) {
        say $token->{ner};
    }
}

Use postfix dereferencing。当然,如果您必须与旧@{ $x->{sentences} }兼容,则可以使用@{ $sentence->{tokens} }perl

答案 1 :(得分:2)

JSON对象用{}表示,数组用[]表示。您在尝试中缺少几个级别的数组:

{                                    # $json
    "sentences": [                   # $json->{sentences}
        {                            # $json->{sentences}->[0]
            "tokens": [              # $json->{sentences}->[0]->{tokens}
                {                    # $json->{sentences}->[0]->{tokens}->[0]
                    "ner": "PERSON"  # $json->{sentences}->[0]->{tokens}->[0]->{ner}

所以不要这样:

$json->{sentences}->{tokens}

你想要这个:

$json->{sentences}->[0]->{tokens}->[0]->{ner}

如果您希望ner键的所有值,而不仅仅是sentencestokens特定下标的值,则需要使用迭代:

my $obj = decode_json($json);

for my $sentence (@{$obj->{sentences}}) {
    for my $token (@{$sentence->{tokens}}) {
        print "$token->{ner}\n";
    }
}