我正在尝试使用mysql存储过程返回一个JSON字符串,该字符串可以使用PHP的json_decode函数转换为关联数组。我有一个从s.p返回的有效JSON字符串,但它的格式不正确,或json_decode($skusJson, true);
由于某种原因不喜欢它。获取s.p结果和执行json_decode的PHP代码是:
$partsQuery = $this->Orders->callSP('part_skus_dropdown1');
$skusJson = $partsQuery->fetchAll('assoc');
$partsQuery->closeCursor();
$skus = json_decode($skusJson[0]['json'], true);
mysql s.p是:
CREATE DEFINER=`root`@`localhost` PROCEDURE `part_skus_dropdown1`()
BEGIN
SELECT
CONCAT('[',
GROUP_CONCAT(
CONCAT('{"id":',id),
CONCAT(',"sku":"',sku,'"}')
),
']')
AS json FROM parts where id < 25;
END
生成的JSON字符串为:
[
{
"id" : 1,
"sku" : "1"
},
{
"id" : 3,
"sku" : "3"
},
{
"id" : 6,
"sku" : "6"
},
{
"id" : 7,
"sku" : "7"
},
{
"id" : 9,
"sku" : "9"
}
]
(sku不会总是与id匹配,而是存储为字符串而不是整数)。 json_decoding的结果是:
[
(int) 0 => [
'id' => (int) 1,
'sku' => '1'
],
(int) 1 => [
'id' => (int) 3,
'sku' => '3'
],
(int) 2 => [
'id' => (int) 6,
'sku' => '6'
],
(int) 3 => [
'id' => (int) 7,
'sku' => '7'
]
]
无论如何,我可以得到结果数组的形式为[id =&gt; sku] :(显示alt.sku格式)
[
(int) 1 => '1',
(int) 3 => '3',
(int) 58 => '3-BOX100'
]
我被卡住了......我一直在关注http://php.net/json_decode文档,并使用http://jsonlint.com/查看sp的结果,但是请考虑一下寻求帮助的时间...提前感谢:)
答案 0 :(得分:2)
更改您的过程,使其返回单个JSON对象,而不是数组,然后使用id
作为键,sku
作为每个元素中的值
CREATE DEFINER=`root`@`localhost` PROCEDURE `part_skus_dropdown1`()
BEGIN
SELECT
CONCAT('{',
GROUP_CONCAT(
CONCAT('"',id, '": "',sku,'"')
),
'}')
AS json FROM parts where id < 25;
END
请注意,JSON对象的键始终是字符串,它们不能是整数。但是当加入数组时,PHP和Javascript都会自动在整数和字符串之间进行转换。
答案 1 :(得分:1)
您的问题是您需要将行转换为由id键入的关联数组。这样做
function rowsToAssoc ($rows) {
$assoc = Array();
for ($rows as $r) {
$assoc[$r['id']] = $r['sku'];
}
return $assoc;
}
然后你可以根据需要进行json_encode / decode。
如果您使用PDO进行MySQL调用,请查看this answer以避免完全循环