在PHP中仅解码JSON的第一级 问题
我想解码一个JSON字符串。但是,我只想解码第一级,JSON的其余部分应该保留为字符串值,而不是嵌套数组 使用类似的技术,生成的数组(带有嵌套字符串值)应该解析回JSON字符串。当连续使用这些解码和编码时,结果应该是原始JSON字符串 简洁明了,对吗 我也不希望解释JSON的嵌套值,因为这些值可能是有效的JSON,也可能不是有效的JSON。如果没有办法,那就这样吧 例子 请注意,所有这些斜杠只是为了保持它是一个有效的PHP字符串,它们不是输入的一部分。输入中没有转义引号 当放入类似这样的JSON字符串时:在PHP中仅解码JSON的第一级 问题,php,json,Php,Json,我想解码一个JSON字符串。但是,我只想解码第一级,JSON的其余部分应该保留为字符串值,而不是嵌套数组 使用类似的技术,生成的数组(带有嵌套字符串值)应该解析回JSON字符串。当连续使用这些解码和编码时,结果应该是原始JSON字符串 简洁明了,对吗 我也不希望解释JSON的嵌套值,因为这些值可能是有效的JSON,也可能不是有效的JSON。如果没有办法,那就这样吧 例子 请注意,所有这些斜杠只是为了保持它是一个有效的PHP字符串,它们不是输入的一部分。输入中没有转义引号 当放入类似这样的JSON
"{
\"foo\": \"bar\",
\"nested\": {
\"nested_key\": \"nested_value\"
},
\"another_top_level_key\": \"some_useful_value\"
}"
这应该是输出:
[
"foo" => "bar",
"nested" => "{ \"nested_key\": \"nested_value\" }",
"another_top_level_key" => "some_useful_value"
]
使用var\u dump
时,应如下所示:
array(3) {
["foo"]=>
string(3) "bar"
["nested"]=>
string(32) "{ "nested_key": "nested_value" }"
["another_top_level_key"]=>
string(17) "some_useful_value"
}
请注意,当使用var\u dump
时,引号不会转义,因此字符串中不存在斜杠(嵌套引号不会转义)
当通过第二个函数(编码器)运行该数组时,应返回原始JSON字符串
我尝试过的事情:
- 我尝试将
的json\u decode()
设置为1。但是,这仅在达到限制时抛出异常$depth
- 我尝试使用
对整个字符串进行解码,然后在顶级键值对上循环,在数组中的任何值上运行json\u decode()
。最初的最终结果很好,但当转换回JSON字符串时,它用斜杠跳过了双引号。在这种情况下,最终结果与原始结果不同,因为最终结果包括斜杠json\u encode()
按照德赛的要求:
$jsonString = "{ \"foo\": \"bar\", \"nested\": { \"nested_key\": \"nested_value\" }, \"another_top_level_key\": \"some_useful_value\" }";
$decoded = json_decode($jsonString, true);
foreach ($decoded as $key => $value) {
if (is_array($value)) {
$decoded[$key] = json_encode($value);
}
}
$encoded = json_encode($decoded);
var_dump($encoded);
结果是:
string(102) "{"foo":"bar","nested":"{\"nested_key\":\"nested_value\"}","another_top_level_key":"some_useful_value"}"
这意味着最后,它确实转义了引号,这是我无法接受的:(.使用函数检查元素是否为数组,然后转换回json:
<?php
$json = "{
\"foo\": \"bar\",
\"nested\": {
\"nested_key\": \"nested_value\"
},
\"multinested\": {
\"multinested_key\": {
\"multinested_key\": \"nested_value\"
}
},
\"another_top_level_key\": \"some_useful_value\"
}";
$array = json_decode($json, true);
foreach($array as &$item) {
if (is_array($item)) {
$item = json_encode($item);
}
}
print_r($array);
使用函数检查元素是否为数组,然后将其转换回json:
<?php
$json = "{
\"foo\": \"bar\",
\"nested\": {
\"nested_key\": \"nested_value\"
},
\"multinested\": {
\"multinested_key\": {
\"multinested_key\": \"nested_value\"
}
},
\"another_top_level_key\": \"some_useful_value\"
}";
$array = json_decode($json, true);
foreach($array as &$item) {
if (is_array($item)) {
$item = json_encode($item);
}
}
print_r($array);
诀窍是使用解码两次:
$array = json_decode(json_decode($json, true), true);
print_r($array);
诀窍是使用解码两次:
$array = json_decode(json_decode($json, true), true);
print_r($array);
“但是当转换回JSON字符串时,它用斜杠跳过了双引号”-这听起来很奇怪。你能给出一个完整的例子来证明这一点吗?总的来说,在你开始玩弄自定义解析器之前,这是最明智的方法。你是双JSON编码你的值,这当然会导致引号是e如果你正在对整个数组进行解码,然后重新编码所有的东西,为什么在中间有一个JSON值的数组会有用呢?“但是当转换成JSON字符串时,它就避免了带有斜线的双引号”——这听起来很奇怪。你能举一个完整的例子来演示吗?最明智的方法是,在你开始使用自定义解析器之前,你是双JSON对你的值进行编码,这当然会导致引用被漏掉。如果你正在对整个数组进行解码,然后重新编码所有的东西,为什么在中间有一个JSON值的数组是有用的呢?实际上我也尝试过。确实做了我想要的。但是,我现在如何取回原始JSON字符串?有关更多信息,请参阅我的编辑。我实际上也尝试了此操作,它确实做了我想要的。但是,我现在如何取回原始JSON字符串?有关更多信息,请参阅我的编辑。