如何删除JSON Web响应的部分内容?

时间:2015-01-23 02:32:47

标签: json perl

我有一个简单的Perl脚本,我想要删除“city”这个词。或删除逗号“,”的第n次出现(在我的特定情况下为第2次)的所有内容。这是下面的内容。

#!/usr/bin/perl
use warnings;
use strict;

my $CMD = `curl http://ip-api.com/json/8.8.8.8`;
chomp($CMD);
my $find = "^[^city]*city";

$CMD =~ s/$find//;

print $CMD; 

输出是这样的:

{"as":"AS15169 Google Inc.","city":"Mountain View","country":"United States","countryCode":"US","isp":"Google","lat" :37.386,"lon":-122.0838,"org":"Google","query":"8.8.8.8","region":"CA","regionName":"California","status":"success","timezone":"America/Los_Angeles","zip":"94035"}

所以我想放弃

" {"as":"AS15169 Google Inc."," 

或放弃

{"as":"AS15169 Google Inc.","city":"Mountain View", 

编辑:

我发现在匹配字符串时我做得太多了。我在“城市”之前删除所有内容,简化了我的问题修复。我的$ find已更改为

my $find = ".*city";

虽然我也像这样更改了替换功能,

$CMD =~ s/$find/city/;

仍然没有想出如何在第n次出现逗号或任何字符/字符串之前删除所有内容。

3 个答案:

答案 0 :(得分:10)

您获得的内容为JSON,因此您可以轻松将其转换为Perl数据结构,使用它,甚至可以根据需要将其转换为JSON。这才是重点!而且,它很容易:

use Mojo::UserAgent;
use Mojo::JSON qw(decode_json encode_json);

my $ua = Mojo::UserAgent->new;

my $tx = $ua->get( 'http://ip-api.com/json/8.8.8.8' );
my $json = $tx->res->body;

my $perl = decode_json( $json );

delete $perl->{'as'};

my $new_json = encode_json( $perl );

print $new_json;

Mojolicious非常棒。即使没有用户代理的东西,这也是我处理JSON的首选方式。如果直接使用JSON字符串,则在元素顺序更改或包含宽字符时可能会出现问题。

答案 1 :(得分:2)

您不必使用Mojolicious手动decode_json()。只需这样做:

my $tx   = $ua->get('http://ip-api.com/json/8.8.8.8');
my $json = $tx->res->json;
my $as   = $json->{as}

你甚至可以使用JSON指针:

my $as = $tx->res->json("/as");

答案 2 :(得分:-1)

这样的东西
#!/usr/bin/perl -w

my $results = `curl http://ip-api.com/json/8.8.8.8`;
chomp $results;
$results =~ s/^.*city":"\w+\s?\w+",//g;

print $results . "\n";

应该做的伎俩..除非你对你想要保持什么有误解。除去。

仅供参考,http://regexr.com/完全可以让我获得正则表达式的快乐。