我一直试图这样做一段时间,我似乎无法做到这一点。 One post让我非常接近但不完全是因为我的JSON层次结构。 (这是一项任务,这种层次结构是强制性的。)
我现在做的是从一个页面提交信息,在另一个页面上将其发布到我的php,将其保存在数组中,json_encode该数组并将其写入我的JSON文件。
这是我的淡化代码,希望摆脱大多数不必要的代码:
<?php
$filename = "json/exercises.json";
$filesize = filesize($filename);
$fp = fopen($filename, "r+");
#Accept the submitted form
$exLanguage = $_POST['exLanguage'];
$exTitle = $_POST['exTitle'];
$exStuff = $_POST['exStuff'];
#write to JSON with an incrementing ID
if (file_get_contents($filename) == "") {
$exercise = array (
"id" => 1,
"lang" => $exLanguage,
"title" => $exTitle,
"main_object" =>
[
"exStuff" => $exStuff
]
);
$exercise_json = json_encode($exercise, JSON_PRETTY_PRINT);
file_put_contents($filename, $exercise_json, FILE_APPEND);
} else {
#Get the last set ID
$jsonid = json_decode(fread($fp, $filesize), true);
$last = end($jsonid);
$title = prev($jsonid);
$lang = prev($jsonid);
$id = prev($jsonid);
$exercise = array (
"id" => ++$id,
"lang" => $exLanguage,
"title" => $exTitle,
"main_object" =>
[
"exStuff" => $exStuff
]
);
$exercise_json = json_encode($exercise, JSON_PRETTY_PRINT);
file_put_contents($filename, $exercise_json, FILE_APPEND);
}
?>
现在这样做是因为如果我的json是空的,它会正确地添加第一个数组,ID为1.然后,如果我再次尝试添加到我的json,它会正确添加它,ID为2.但是更多的尝试写入到JSON会给我这些错误:
警告:end()期望参数1为数组,给定
为null警告:prev()期望参数1为数组,给定
为null警告:prev()期望参数1为数组,给定
为null警告:prev()期望参数1为数组,给定
为null
我试过做
$reset = reset($jsonid);
写入文件后但是没有用,只是在第3次写入时给了我另一个错误,复位也被赋予了null。
任何人都可以告诉我如何让这个太有效了吗?或者,如果有更简单的方法来完成这项工作?
答案 0 :(得分:1)
首先了解JSON格式。它是一组对象,意思是attribute: value
对包裹在{}
中并用逗号,
分隔,然后再次包裹在{}
OR []
顶层。< / p>
您的JSON结构不完整或已损坏。您当前正在执行的操作将在JSON文件中以下列格式创建JSON:
{ "id": 1, "lang": "as", "title": "asdsad" }
{ "id": 2, "lang": "as", "title": "asdsad" }
{ "id": 3, "lang": "as", "title": "asdsad" }
{ "id": 4, "lang": "as", "title": "asdsad" }
因此,json_decode
会因为JSON格式无效而返回null
。
您需要继续在现有JSON中附加新JSON,以便上述格式将如下所示:
[
{ "id": 1, "lang": "as", "title": "asdsad" },
{ "id": 2, "lang": "as", "title": "asdsad" },
{ "id": 3, "lang": "as", "title": "asdsad" },
{ "id": 4, "lang": "as", "title": "asdsad" }
]
这表示您的else
阻止不正确。在else
块中使用以下代码:
$jsonid = json_decode(file_get_contents($filename), true);
$last = end($jsonid);
$id = $last['id'];
$jsonid[] = array (
"id" => ++$id,
"lang" => $exLanguage,
"title" => $exTitle,
"main_object" => array("exStuff" => $exStuff)
);
$exercise_json = json_encode($jsonid, JSON_PRETTY_PRINT);
file_put_contents($filename, $exercise_json, FILE_APPEND);
我希望您不必使用不正确/损坏的JSON格式。在任何情况下,这都不适用于json_decode()
。