2016-11-28 405 views
-1

在bash,我从一个蒙戈查询的JSON响应:解析JSON的字符串

... 
json=`echo $con` 
echo $json 

结果看起来是这样的:

{ "_id" : "579289cc0", "externalId" : "2911", "externalTenantGUID" : "29d3928e53b", "name" :["X", "Y"] ... }{ "_id" : "5792892323", "externalId" : "291e31", "externalTenantGUID" : "29d3928e3253b", "name" :["X", "Y"] ... }{ "_id" : "57923320", "externalId" : "293211", "externalTenantGUID" : "29d3928322e53b", "name" :["X", "Y"] ... } 

在这里,我想分析这个响应$ con并且只得到映射到“_id”的值,比如579289cc0,5792892323,57923320.我尝试使用sed和awk没有成功(对于manny条件),有没有更简单的方法,而不安装python?

+1

你能得到'jq'吗? –

+0

hwo我可以得到jq吗? –

+0

请参阅[这里](https://stedolan.github.io/jq/download/)。 –

回答

0

使用正则表达式perl语法,可以按以下步骤进行。虽然这是一种难以实现的用例,但建议使用jq修复破损的json字符串并提取这些标识符。现在你可以做,

perl -lne 'print "$1" if /.*\"_id\" : \"([[:alnum:]]+)\".*/' file 
579289cc0 
5792892323 
57923320 

此外,您还可以使用grep启用PCRE,即具有-P标志的Perl风格的正则表达式匹配。

grep -Po "\"_id\" :\K \"([[:alnum:]]+)\"" <<<"$json" 
"579289cc0" 
"5792892323" 
"57923320" 
+0

很好它的工作,但不幸它只返回最后json的_id值,可能是因为文件中的jsons在一行。我怎么能设置这个为所有值匹配到“_id”? –

+0

@CatalinaCenan:是的,我假定内容是在你的问题中的新行 – Inian

+0

我提到这是一个mongo查询调用 –

0

做这样的事情

<?php 

$con = '{ "products":[ 
         { 
          "_id": "579289cc0", 
          "externalId": "2911", 
          "externalTenantGUID": "29d3928e53b" 
         }, { 
          "_id": "5792892323", 
          "externalId": "291e31", 
          "externalTenantGUID": "29d3928e3253b" 
         }, { 
          "_id": "57923320", 
          "externalId": "293211", 
          "externalTenantGUID": "29d3928322e53b" 
         } 
        ] 
     }'; 
echo $con; 
$JSON_OBG = json_decode($con, true); 

// print_r($JSON_OBG); 

$Results = ''; 
foreach($JSON_OBG['products'] as $OBG) 
{ 
$Results .= $OBG['_id'].','; 
} 
$Results = rtrim($Results,','); 
echo $Results ; 
?> 
+0

它显示以下错误:./ gettnt.sh:第18行:意外标记附近的语法错误'(' ./gettnt.sh:第18行:'$ JSON_OBG = json_decode($ con,true);'无论如何,没有产品密钥 –

+0

你必须看看如何创建一个JSON对象来处理,,,, –

1

随着JQ:

$ jq '._id' infile 
"579289cc0" 
"5792892323" 
"57923320" 

或者,如果你不想让身边的结果的报价,使用-r为 “原始输出”:

$ jq -r '._id' infile 
579289cc0 
5792892323 
57923320 

如果你的JSON数据是在一个变量,而不是在一个文件中,您可以使用一个here string

$ jq -r '._id' <<< "$json" 
579289cc0 
5792892323 
57923320