【问题标题】:json structure difference after edits编辑后的json结构差异
【发布时间】:2015-08-19 12:36:51
【问题描述】:

我有 json 字符串,我必须对其进行编辑,然后再转换回 json。但遗憾的是我无法真正恢复json结构。

原始json字符串($json)的结构:

"[{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},
{"Language":{"0":"DE"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},
{"Language":{"0":"FR"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}]"

编辑后得到的结构 ($newJson):

"{"0":{"Language":{"0":"EN"},"Text":{"0":"yyy"},"ContentType":{"0":"PlainText"}},
"1":{"Language":{"0":"DE"},"Text":{"0":"yyy"},"ContentType":{"0":"PlainText"}},
"2":{"Language":{"0":"FR"},"Text":{"0":"yyy"},"ContentType":{"0":"PlainText"}}}"

以下是我的编辑操作:

$jsonArray = object_to_array(json_decode($json));
$editedJsonArray = someLoopStuff($jsonArray);
$newJson = json_encode(array_to_object(($editedJsonArray)));

function object_to_array($obj) {
    if(is_object($obj)) $obj = (array) $obj;
    if(is_array($obj)) {
        $new = array();
        foreach($obj as $key => $val) {
            $new[$key] = $this->object_to_array($val);
        }
    }
    else $new = $obj;
    return $new;
}

function array_to_object($a) {
    if (is_array($a) ) {
        foreach($a as $k => $v) {
            $a[$k] = $this->array_to_object($v);
        }
        return (object) $a;
    }
    return $a;
}

您知道如何获得与原始 json 相同的结构吗?

【问题讨论】:

    标签: php arrays json object


    【解决方案1】:

    使用数组而不是对象。将 true 传递给 json_decode() 作为第二个参数,然后在数组上执行您的操作。

    $jsonArray = json_decode($json, true);
    

    然后只需在$jsonArray 上循环操作并简单地使用json_encode(),无需任何额外工作。


    要获得与输入完全相同的输出,您需要在对象上转换子数组:

    $jsonArray = json_decode('[{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"DE"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"FR"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}]', true);
    
    foreach ($jsonArray as &$item) {
        foreach ($item as &$val) {
            $val = (object) $val;
        }
        unset($val);
    }
    unset($item); 
    
    var_dump(json_encode($jsonArray));
    

    输出:

    string(226) "[{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"DE"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"FR"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}]"
    

    【讨论】:

    • 感谢您为我指明了正确的方向。但现在我得到{"Language":["EN"],"Text":["xxx"],"ContentType":["PlainText"]} 而不是{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}。知道如何解决这个问题吗?
    【解决方案2】:

    如果您尝试避免使用函数 object_to_array 和 array_to_object 会怎样。在编码部分没有必要,因为 json_encode 可以处理对象或数组。在第一部分中,可以调用 json_decode 并将第二个可选参数设置为 true 以生成数组而不是对象。见PHP manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2016-01-17
      • 2020-03-19
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多