我正在尝试使用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);
答案 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
键的所有值,而不仅仅是sentences
和tokens
特定下标的值,则需要使用迭代:
my $obj = decode_json($json);
for my $sentence (@{$obj->{sentences}}) {
for my $token (@{$sentence->{tokens}}) {
print "$token->{ner}\n";
}
}