首页 > 解决方案 > 仅在 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 字符串。

我尝试过的事情:

笔记

尽管这个问题的标题与这个问题非常相似,但该问题实际上并不包含其标题的答案。关于如何将无效的 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"}"

这意味着最后,它确实逃脱了引号,这是我不能接受的:(。

标签: phpjson

解决方案


使用函数检查何时将元素作为数组然后转换回 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
)

推荐阅读