2016-07-12 33 views
2

我有一个返回下面的JSON对象的网址:从外部URL获取JSON对象与PHP

{ 
    "addressList": { 
     "addresses": [ 
      { 
       "id": 0000000, 
       "receiverName": "Name Example", 
       "country": { 
        "id": "BRA", 
        "name": "Brasil" 
       }, 
       "state": { 
        "id": "SP" 
       }, 
       "city": "São Paulo", 
       "zipcode": "00000000", 
       "type": "Residential", 
       "street": "000, St Example", 
       "number": 00, 
       "neighborhood": "Example", 
       "hash": "1bf09357", 
       "defaultAddress": false, 
       "notReceiver": false 
      } 
     ] 
    } 
} 

我想要得到的state值,我怎么能检索与PHP?

我试过了,就像这样,但我无法获得state的值,在这种情况下应该是SP

$string = '{ "addressList": { "addresses": [ { "id": xxxxxx, "receiverName": "XXXXX XXXXX", "country": { "id": "BRA", "name": "Brasil" }, "state": { "id": "SP" }, "city": "São Paulo", "zipcode": "03164xxx", "type": "Residential", "street": "Rua xxx", "number": xx, "neighborhood": "xxxxx", "hash": "xxxxx", "defaultAddress": false, "notReceiver": false } ] } }'; 

     $json_o = json_decode($string); 

     $estado = $json_o->state; 

我怎样才能达到我想要的结果?

+0

其AddressList中,地址(第一指标),状态,那么ID,你不能只是直接使用状态,其内部没有下父级别,请使用'print_r/var_dump'查找 – Ghost

+0

请注意,JSON中的数字“八进制和十六进制格式未使用”。 – MinhTri

回答

3

您的JSON是无效的 - 你可以验证它jsonlint.com这是无效的,由于格式不正确的数值 - "id" : 000000)。

从此,你可以解码的价值和访问您的数据:

$json_o = json_decode($string); 

$estado = $json_o->addressList->addresses[0]->state->id; 

如果您没有访问到生成JSON的代码,你可以尝试运行一个正则表达式匹配,取代&与"包裹的数值:

$valid_json = preg_replace("/\b(\d+)\b/", '"${1}"', $str); 

注意:上面只是一个例子 - 你必须弄清楚一个数值已经被"包裹的情况。

+0

非常感谢,我得到了它的工作。 –

+0

@JoyCooper我的荣幸。 – Darren

0

尝试:

$json_o = json_decode($string, true); $estado = $json_o['addressList']['addresses'][0]['state']['id'];

+0

它没有工作,我仍然无法获得价值。 –

+0

在'json_decode()'后面运行'echo json_last_error()'。你会得到什么输出? –

+0

我只有数字'4'作为输出。 –

1

你的JSON有几个语法错误:

"id":  0000000 
"number": 00 

JSON不支持前导零。如果精确的格式化是很重要的,使用字符串:

"number": "00" 
"id":  "0000000" 

在JSON或者,使用格式良好的整数(节省空间),并将其转换为PHP格式化的字符串。

修复了JSON之后,您可以像下面这样访问第一个地址的state->id值。当您从不受信任的源解码JSON,准备做一些错误处理:

$json_string ="..."; //your source, to be decoded 

$json_o= json_decode($json_string); 

if(is_null($json_o)): //there was an error decoding   
    $errno = json_last_error(); 
    $err_msg = json_last_error_msg(); 
    die("Json decode failed: Error #$errno: $err_msg"); 
endif; 
//we get here if json_decode succeeded. To get "SP", do... 
$stateID = $json_o->addressList->addresses[0]->state->id; 
+0

这是一个好主意,但它并没有回答如何访问'state'字段的问题。 – Barmar

+0

你说得对。编辑。 – BeetleJuice