将JSON字符串转换为PHP数组。

8

我有以下JSON字符串,它是一个Objective C数组,然后编码为JSON:

 $jsonString=[\"a@gmail.com\",\"b@gmail.com\",\"c@gmail.com\"]

我想将这个转换为普通的PHP数组。我尝试了很多方法,但似乎都不起作用:

$arrayOfEmails=json_decode($jsonString); //doesn't work
$arrayOfEmails=(array)json_decode($jsonString); //doesn't work

有什么想法吗?

编辑:

我仍然无法让它工作。

$decodeEmails=$_POST["arrayOfEmails"];
sendResponse(200, $decodeEmails);
//the above returns exactly whats after this colon:[\"a@gmail.com\",\"b@gmail.com\",\"c@gmail.com\]

我需要做这件事:$arrayOfEmails=json_decode($decodeEmails); 但是我认为我需要在$decodeEmails周围加上引号这样才能工作。我该如何在$decodeEmails字符串周围添加引号?


似乎您需要在字符串中转义引号才能使其有效:"[\"m@gmail.com\",\"b@gmail.com\",\"c@gmail.com\"]" - driangle
这是字符串的Objective C版本。它通过POST发送到PHP。 - Snowman
你需要定义“不起作用”的具体表现。json_decode()是实现此目的的正确方法,那么当你使用它时得到了什么结果? - JAAulde
我现在已经编辑了,这是实际的PHP字符串。我需要先对它做些什么吗? - Snowman
9个回答

10
尝试这个:json_decode($json_string, true);

2
这是正确的,其他答案似乎不知道json_decode()第二个参数,并且只对一级元素进行类型转换。 - Xeoncross
但是这会返回一个关联数组,不是吗?我只想要一个常规的。 - Snowman
@mohabitar,PHP只有一种类型的数组。我想你是指数组键不是数字对吧?你需要检查或纠正的是你的输入,以获得你想要的输出。 - Xeoncross
在问题中给出的情况下,不需要第二个参数。第二个参数是用于将JSON序列化对象转换为关联数组。OP有一个JSON序列化索引数组。 - JAAulde
当我向json_decode()传递第二个参数assoc=true时,它可以工作,但我必须调用它两次才能实现我的输出。 - Mohini

9

您应该引用您的字符串,这样它就可以正常工作,请看这里

$jsonString = '["m@gmail.com","b@gmail.com","c@gmail.com"]';
$arrayOfEmails=json_decode($jsonString);

或者
$jsonString = "[\"a@gmail.com\",\"b@gmail.com\",\"c@gmail.com\"]";
$arrayOfEmails=json_decode($jsonString);

如果你已经转义了",那么你可以使用" - xdazz
var_dump 给出了以下结果(实际数组有超过3个元素,这里只是为了展示而省略了一些):string(457) "[\"a@gmail.com\",\"b@gmail.com\",\"c@gmail.com\"]" - Snowman
@mohabitar 它已经是一个字符串,你可以直接在它后面使用json_decode。 - xdazz
但这不就是我正在做的吗?$decodeEmails=$_POST["arrayOfEmails"]; $arrayOfEmails=json_decode($decodeEmails); - Snowman

3
$data = unserialize($data) 

现在您可以将$data作为数组获取

例如:$data的值可能是这样的

$data = "a:2:{s:18:"_1337666504149_149";a:2:{s:8:"fbregexp";s:1:"1";s:5:"value";s:4:"2222";}s:18:"_1337666505594_594";a:2:{s:8:"fbregexp";s:1:"3";s:5:"value";s:5:"45555";}}";

$data = unserialize($data) 

现在我获得的数值是这样的

Array ( [fbregexp] => 1 [value] => 2222 ) [_1337666505594_594] => Array ( [fbregexp] => 3 [value] => 45555 ) )

2
    $str=<<<H
    {"a":"AAA","b":"333"}
    H;

     $object = json_decode($str); 
     $array  = json_decode($str , 1 );

    // $arr = get_object_vars( json_decode($str) );

1
如果json_decode无法正常工作,可以尝试像这样做:
$arr = explode( '\\",\\"', substr( $json, 3, strlen( $json ) - 3 ) );

对我来说起作用了,因为我在URL中传递了JSON字符串。 - Ajeesh Joshy

1
你可以使用 json_decode() 然后 print_r() 来创建一个 PHP 格式的数组。
<?php
$json = file_get_contents('json/yourscript.json'); // Get the JSON data
$phpObj = json_decode($json,true);  // Convert to PHP Object
print_r($phpObj);  // Convert to PHP Array
?>

0

这段代码运行良好。

$jsonString = '["m@gmail.com","b@gmail.com","c@gmail.com"]';
$arrayOfEmails=json_decode($jsonString);
$arrayOfEmails=(array)json_decode($jsonString);
print_r($arrayOfEmails);

在这种情况下,您不必转义引号。 - Prasad Rajapaksha
你应该使用第二个参数来转换为一个数组,而不是进行类型转换:json_decode($value, $array = TRUE) - Xeoncross
是的。我刚试着修复了他的错误。这是我的结果。数组([0] => m@gmail.com [1] => b@gmail.com [2] => c@gmail.com - Prasad Rajapaksha
不需要进行类型转换,也不需要将第二个参数传递为“true”。 - JAAulde

0

-2
$arr = explode( '\\",\\"', substr( $json, 3, strlen( $json ) - 3 ) )

这个解决方案不错,但是为了获取完整的有效数组,我使用了strlen($json) - 6,所以应该是:

$arr = explode( '\\",\\"', substr( $json, 3, strlen( $json ) - 6 ) );

var_dump($arr);

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