【问题标题】:Pushing Objects to JSON-File将对象推送到 JSON 文件
【发布时间】:2019-02-21 13:40:42
【问题描述】:

我的问题是通过 PHP 以正确的方式将一些内容推送到 JSON 文件。我已经写了一些代码,但它不会工作。

这是我的代码:

//Get Form Data
$formdata_host = array (
  'server' => array ( $Server => array(
    array (
        'svc' => $_POST['valservice'],
        'id'=> 1
    )
  ))
);

//Get data from existing json file
$jsondata = file_get_contents($filename_moni);

//converts json data into array
$arr_data = json_decode($jsondata, true);

//Push details data to array
array_push($arr_data,$formdata_host);

//Reindex the Array
$arr_data = array_values($arr_data);

//Convert updated array to JSON
$jsondata = json_encode($arr_data, JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK);

//write json data into data.json file
if(file_put_contents($filename_moni, $jsondata)) {
    echo 'Daten erfolgreich gespeichert!';
}
else 
    echo "Error";

}
catch (Exception $e) {
    echo 'Ausnahme entdeckt: ',  $e->getMessage(), "\n";
}

这是我执行后得到的 JSON 内容:

[
 {
    "server": {
        "TEST": [
            {
                "svc": "TEST",
                "id": 1
            }
        ]
    }
 }
]

但我需要这个:

{
   "server": {
      "TESTSERVER": [
        {"svc":"TESTSERVICE", "id":1}
     ]
    }
}

我知道 [] 用于数组,而 {} 用于对象。 我首先需要一个 JSON-Object -> 服务器,然后是第二个 JSON-Object -> 主机名,然后是一个 JSON-Array,后面是几个填充了服务名称和 ID 的 JSON-Object。

我希望你能帮助我,因为这个问题现在让我发疯。

【问题讨论】:

  • $Server$_POST['valservice'] 有什么价值?如果我查看您的预期结果与当前结果,代码似乎没有太大问题,但只是错误的值。
  • 首先,您在输出中得到一个数组,因为您正在对一个数组进行 JSON 化。如果你想要一个对象,JSON 化一个对象。因此,您需要创建一个对象,在该对象上创建您想要输出的属性以及您想要输出的类型,然后对该对象进行 JSON 化。
  • 将此array_push 更改为array_mergearray_replace 并删除此array_values 此外,您还缺少catchtry 部分,这可能是一个错字或遗漏从问题。

标签: php arrays json file object


【解决方案1】:

改变这两件事(正如我在 cmets 中所说的)

//Push details data to array
$arr_data = array_merge($arr_data,$formdata_host);
//array_push($arr_data,$formdata_host);

//Reindex the Array
//$arr_data = array_values($arr_data);

这会将server 键放在数组的顶层您想要的位置。

输出

{
    "server": {
        "TESTSERVER": [
            {
                "svc": "TESTSERVER",
                "id": 1
            }
        ]
    }
}

Sandbox

我可以告诉 array_values 是错误的,因为您希望 server 成为“顶级”键,而 array_values 永远不会发生这种情况,因为它会剥离该键。

array_push 很少是您在组合数组时想要做的事情,因为它推动了数组的整个结构。所以你有

 [ "server" => ..... ]

被添加,而不仅仅是

"server" => .....

内容。

【讨论】:

  • 非常感谢.. 这个答案非常接近我需要的解决方案。但是我仍然有一个问题。如何将额外的服务器推送到 JSON 文件?对于每个新的 TESTSERVER,列表都会被完全删除。如何添加不同的新服务器;所以 TESTSERVER1 和 TESTSERVER2 在一个 JSON 文件中?
  • 所以我必须将array_merge 与array_push 结合起来?我是对的,我必须将 JSON 文件的结构从 { "server" => .. } 更改为 [ "server" => ... ]?是否有另一种可能将新服务器添加到文件中?
  • So i have to combine array_merge with array_push -- 否。使用 array_merge 代替 array_push 并删除 array_values。正如我发布的那样。
  • Am i right, that i have to change the Structure 不,如果您阅读了我发布的内容,它显示了您想要并且可以获得的结构。如果再次,您阅读了我发布的内容。
  • 你误解了我。我已经很好地阅读了你的回答。您的解决方案运行良好。我已将 array_push 替换为 array_merge 并从代码中删除了 array_values。我的问题是,我想添加新值而不是替换整个 JSON 文件。所以最后我想在 JSON 文件中添加第二个服务器 - > TESTSERVER2。
【解决方案2】:

我找到了解决方案:

array_replace_recursive($array, $array2);

来源: php array_merge without erasing values?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多