在PHP中仅解码JSON的第一级 问题

在PHP中仅解码JSON的第一级 问题,php,json,Php,Json,我想解码一个JSON字符串。但是,我只想解码第一级,JSON的其余部分应该保留为字符串值,而不是嵌套数组 使用类似的技术,生成的数组(带有嵌套字符串值)应该解析回JSON字符串。当连续使用这些解码和编码时,结果应该是原始JSON字符串 简洁明了,对吗 我也不希望解释JSON的嵌套值,因为这些值可能是有效的JSON,也可能不是有效的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()
    $depth
    设置为1。但是,这仅在达到限制时抛出异常
  • 我尝试使用
    json\u decode()
    对整个字符串进行解码,然后在顶级键值对上循环,在数组中的任何值上运行
    json\u encode()
    。最初的最终结果很好,但当转换回JSON字符串时,它用斜杠跳过了双引号。在这种情况下,最终结果与原始结果不同,因为最终结果包括斜杠
笔记 尽管这个问题的标题与之非常相似,但实际上它的标题并没有包含答案。关于如何将无效的JSON字符串转换为有效的JSON,只有一个答案

我宁愿不使用任何正则表达式,因为这只会使我的生活变得比需要的更复杂;)。但如果无法避免,我想那就是生活


按照德赛的要求:

$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字符串?有关更多信息,请参阅我的编辑。