如何在PHP中解码JSON字符串?
我有一个JSON字符串,如下所示:如何在PHP中解码JSON字符串?,php,json,Php,Json,我有一个JSON字符串,如下所示: {"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"a
{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}
什么是PHP来解码它并将address1
、address2
、address3
、city
和postalCode
放入会话变量
到目前为止,我试过这个,但不起作用:
$results = json_decode(strstr($address, '{"addresses":{"address":[{'), true);
$_SESSION['address1'] = $results['address']['address1'];
谢谢 可以尝试$results['address']['address']['address1']
不知道为什么要使用strstr。但是在这个例子中,它看起来不会改变任何东西。您可以使用print\r输出$results,以准确了解对象输出的外观。
print\r
是您了解JSON结构的朋友
<?php
$addresses = json_decode('{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}');
$_SESSION['address1'] = $addresses->addresses->address[0]->address1;
$_SESSION['address2'] = $addresses->addresses->address[0]->address2;
$_SESSION['address3'] = $addresses->addresses->address[0]->address3;
$_SESSION['city'] = $addresses->addresses->address[0]->city;
$_SESSION['postalCode'] = $addresses->addresses->address[0]->postalCode;
print_r($_SESSION);
如果您打印了阵列,您可以看到布局是如何的:
stdClass Object
(
[addresses] => stdClass Object
(
[address] => Array
(
[0] => stdClass Object
(
[@array] => true
[@id] => 888888
[@uri] => xyz
[household] => stdClass Object
(
[@id] => 44444
[@uri] => xyz
)
[person] => stdClass Object
(
[@id] =>
[@uri] =>
)
[addressType] => stdClass Object
(
[@id] => 1
[@uri] => xyz
[name] => Primary
)
[address1] => xyz
[address2] =>
[address3] =>
[city] => xyz
[postalCode] => 111111
)
)
)
)
为什么不解码整个JSON字符串,然后得到您需要的呢
$address = '{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}';
$results = json_decode($address, true);
$address = $results['addresses']['address'][0];
print $address['address1'];
print $address['address2'];
print $address['postalCode'];
将json格式的字符串解码为PHP对象
试试这个:
$results = json_decode($address);
$results['address1'] = $results->addresses->address[0]->address1;
$results['address2'] = $results->addresses->address[0]->address2;
$results['address3'] = $results->addresses->address[0]->address3;
$results['city'] = $results->addresses->address[0]->city;
$results['postalCode'] = $results->addresses->address[0]->postalCode;
编辑-更新,我一开始误读了你的JSON。JSON\u decode($jsonData)返回一个对象,而不是数组
例如:
stdClass Object
(
[addresses] => stdClass Object
(
[address] => Array
(
[0] => stdClass Object
(
[@array] => true
[@id] => 888888
[@uri] => xyz
[household] => stdClass Object
(
[@id] => 44444
[@uri] => xyz
)
[person] => stdClass Object
(
[@id] =>
[@uri] =>
)
[addressType] => stdClass Object
(
[@id] => 1
[@uri] => xyz
[name] => Primary
)
[address1] => xyz
[address2] =>
[address3] =>
[city] => xyz
[postalCode] => 111111
)
)
)
)
访问数据的方式:
$object = json_decode($jsonString);
$object->addresses->address[0]; // First address object
$object->addresses->address[0]->{"@array"}; // Not good way to access object property (damn @)
$object->addresses->address[0]->address1;
$object->addresses->address[0]->addressType->{"@id"}; // Again damn @
请注意,这些“@array”和“@id”字段是无效的JSON符号,从技术上讲,它们会导致JSON解析器中出现未指定的行为。此字段将把所有标量值和空值放入会话中,其中键不以@
$jsonString = '{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}';
$result = json_decode($jsonString);
// will put *all* scalar and null values into session where key does not begin with a @
foreach($result->addresses->address[0] as $key=>$value) {
if (substr($key, 0, 1) != '@' && (is_scalar($value) || is_null($value)) ) {
$_SESSION[$key] = $value;
}
}
print_r($_SESSION);
?>
什么事情没有发生,而你却想发生?始终描述您想要的行为和您得到的行为。在输出任何内容和引用$会话之前,您是否调用了
session\u start()
。。。如此少的问题向上投票。许多答案通常意味着简单的问题,而不是好的问题。对某些人来说简单,但对其他人来说不好,因此是问题。+1要按照显示的方式打印结果,请在print_r()后添加标记。这件事我花了很长时间才弄明白!令人惊叹的!!!!非常感谢,这次成功了。我选择提到我正在使用strstr,因为我在$addresses中包含了一些其他头信息,需要将其切掉。但这确实起到了作用,我非常感激!!!
$jsonString = '{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}';
$result = json_decode($jsonString);
// will put *all* scalar and null values into session where key does not begin with a @
foreach($result->addresses->address[0] as $key=>$value) {
if (substr($key, 0, 1) != '@' && (is_scalar($value) || is_null($value)) ) {
$_SESSION[$key] = $value;
}
}
print_r($_SESSION);
?>