php - 仅在 PHP 中解码 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_dump
,它应该是这样的:
array(3) {
["foo"]=>
string(3) "bar"
["nested"]=>
string(32) "{ "nested_key": "nested_value" }"
["another_top_level_key"]=>
string(17) "some_useful_value"
}
请注意,使用 时var_dump
,引号不会转义,因此字符串中不存在斜杠(嵌套引号不会转义)。
当该数组通过第二个函数(编码器)运行时,应返回原始 JSON 字符串。
我尝试过的事情:
- 我尝试将
$depth
of设置json_decode()
为 1。但是,这只会在达到限制时引发异常。 - 我尝试使用解码整个字符串
json_decode()
,然后循环遍历顶级键值对以json_encode()
遍历任何作为数组的值(应指示嵌套值)。最终结果起初很好,但是当转换回 JSON 字符串时,它用斜杠转义了双引号。在这种情况下,最终结果与原始结果不同,因为最终结果包括斜线。
笔记
尽管这个问题的标题与这个问题非常相似,但该问题实际上并不包含其标题的答案。关于如何将无效的 JSON 字符串转换为有效的 JSON,只有一个答案。
我宁愿不使用任何正则表达式,因为那只会让我的生活变得比它需要的更复杂;)。但如果无法避免,那我想这就是生活。
根据 deceze 的要求:
$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);
输出:
Array
(
[foo] => bar
[nested] => {"nested_key":"nested_value"}
[multinested] => {"multinested_key":{"multinested_key":"nested_value"}}
[another_top_level_key] => some_useful_value
)
推荐阅读
- r - 如何使用 R 中的 ggplot2 将标签添加到条形图中的条形图中?
- c++ - 如何避免参数数量取决于条件的调用分支?
- javascript - JavaScript:此事件侦听器调用的函数侦听器与预期不符
- authentication - 带有用户名和密码的 Openvpn
- asp.net-core - 如何在新用户注册时修复 EntityValidationError?
- c++ - RGB转XYZ,图像转换
- tensorflow - TF 2.0 Alpha 和 TF nightly preview 有什么区别?
- python - 如何在短时间内更改变量的值?
- android - 如何检测 NestedScrollView 的哪个滚动子项被滚动?
- c++ - 如何生成一个伪随机 32 字节字符串以用作加密哈希函数中的盐?