如何在PHP中将字符串转换为JSON对象

101

我有一条来自 SQL 查询的以下结果:

{"Coords":[
    {"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"} 
    ]
}

它目前是PHP中的一个字符串。我知道它已经是JSON形式了,那么有没有一种简单的方法将其转换为JSON对象?

我需要它成为一个对象,这样我就可以添加一个额外的项目/元素/对象,就像"Coords"已经是的那样。


2
@user2363025 这是您的字符串转换为有效的JSON格式:http://pastebin.com/R16NVerw - Miro Markaravanes
@MiroMarkarian 虽然 JSON 是有效的,但你破坏了日期格式 xD - Dan
JsonLint做到了我没有做到的。我只是为了展示什么是有效的而发布了这个。当进行程序转换时,这种情况不会发生。 - Miro Markaravanes
1
@YogeshSuthar 谢谢,这是一个好链接! - user2363025
我看到你编辑了问题,告诉我:初始数据是以JSON格式存在的,你想将其转换为PHP变量(数组/对象 - stdClass),添加数据并再次转换为JSON吗?注意:我已经编辑了我的答案。 - Guilherme Nascimento
6个回答

169

@deceze所说的是正确的,看起来你的JSON格式不正确,请试试这样:

{
    "Coords": [{
        "Accuracy": "30",
        "Latitude": "53.2778273",
        "Longitude": "-9.0121648",
        "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778273",
        "Longitude": "-9.0121648",
        "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778273",
        "Longitude": "-9.0121648",
        "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778339",
        "Longitude": "-9.0121466",
        "Timestamp": "Fri Jun 28 2013 11:45:54 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778159",
        "Longitude": "-9.0121201",
        "Timestamp": "Fri Jun 28 2013 11:45:58 GMT+0100 (IST)"
    }]
}

使用json_decode将字符串转换为对象(stdClass)或数组:http://php.net/manual/zh/function.json-decode.php

[编辑过的内容]

我不理解您所说的“官方JSON对象”是什么意思,但假设您想通过PHP向JSON添加内容,然后将其转换回JSON?

假设您有以下变量:

$data = '{"Coords":[{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}]}';
你应该将它转换为对象(stdClass): $manage = json_decode($data); 但是,使用stdClass比PHP数组更复杂,那么请尝试这样做(使用第二个参数并将其设置为true): $manage = json_decode($data, true); 这样,您就可以使用数组函数:http://php.net/manual/en/function.array.php 添加一个项目:
$manage = json_decode($data, true);

echo 'Before: <br>';
print_r($manage);

$manage['Coords'][] = Array(
    'Accuracy' => '90'
    'Latitude' => '53.277720488429026'
    'Longitude' => '-9.012038778269686'
    'Timestamp' => 'Fri Jul 05 2013 11:59:34 GMT+0100 (IST)'
);

echo '<br>After: <br>';
print_r($manage);

移除第一个项目:

$manage = json_decode($data, true);
echo 'Before: <br>';
print_r($manage);
array_shift($manage['Coords']);
echo '<br>After: <br>';
print_r($manage);

你是否有想要将其保存为JSON格式并存入数据库或者文件的可能性:

$data = '{"Coords":[{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}]}';

$manage = json_decode($data, true);

$manage['Coords'][] = Array(
    'Accuracy' => '90'
    'Latitude' => '53.277720488429026'
    'Longitude' => '-9.012038778269686'
    'Timestamp' => 'Fri Jul 05 2013 11:59:34 GMT+0100 (IST)'
);

if (($id = fopen('datafile.txt', 'wb'))) {
    fwrite($id, json_encode($manage));
    fclose($id);
}

谢谢,我一直在为为什么我推送到另一个数组的数组显示为字符串而不是对象而苦恼。 - SleepNot
如果你不是在处理 stdClass,而且简单的 json_decode 函数无法正常工作,那么在之前将字符串强制转换为 (array) 可以解决问题。 - LatentDenis
对于我的情况,添加 true 标志解决了问题。我之前只是传递数据而没有使用 true 参数,因此没有得到正确的响应。谢谢。 - stanley mbote

30
要将有效的JSON字符串转换回来,您可以使用json_decode()方法。
要将其转换回对象,请使用此方法:
$jObj = json_decode($jsonString);

要将其转换为关联数组,请将第二个参数设置为true

$jArr = json_decode($jsonString, true);

顺便提一下,要将您提到的字符串转换回其中任何一个,您需要有一个有效的JSON字符串。为了实现这一点,您应该按照以下步骤进行: 1.在Coords数组中,从对象的开头和结尾删除两个双引号(")。 2. 数组中的对象由逗号(,)分隔,因此在Coords数组中的对象之间加上逗号。 然后你就会得到一个有效的JSON字符串。 这里是我将您的JSON字符串转换为有效的字符串:http://pastebin.com/R16NVerw

1
是的!我们可以使用json_encode中的_assoc_参数,而不是将其强制转换为数组。引用PHP文档:“当设置为TRUE时,返回的对象将被转换为关联数组。” - CPHPython

10

你可以举个例子来说明

$array = json_decode($string,true)

但在此之前请验证Json。您可以从http://jsonviewer.stack.hu/进行验证。


7

如果您不传递第二个参数或者传入false,json_decode()将会将JSON解析为stdClass对象,因此您可以使用“->”箭头符号来访问对象属性。

<?php

// Store JSON data in a PHP variable
$json = '{"email":"john@doe.com"}';

$obj = json_decode($json, false);
print $obj->email;

?>

输出

john@doe.com

0

@Miro Markaravanes 为我省去了很多时间。在我的情况下,我将一个类似于 OP 的 JSON 对象的字符串存储在数据库中。当调用它时,字符串开头和结尾都有双引号。

由于这个原因,每次我尝试使用 json_decode 都无法正常工作。

所以我采取了以下措施:

    $data = substr($data, 1);
    $data = substr($data, 0, -1);
    $data = json_decode($data);

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接