我有一个.json
文件,我想将一个对象附加到文件中的矢量上,但是出现一些错误。
$json = file_get_contents('materialsdb/'.$_POST["materialtype"].'.json');
$jsonarray = json_decode($json, true);
$myObj->short = $_POST["short"];
//here I got: Warning: Creating default object from empty value
$myObj->title = $_POST["title"];
$myObj->description = $_POST["description"];
$myObj->cover = "";
$myObj->VR = false;
$myObj->slow = false;
$td = '2D';
$myObj->$td = false;
$fd = '3D';
$myObj->$fd = false;
if($_POST["isprivate"]){
$myObj->license = "nonfree";
} else {
$myObj->license = "free";
}
$myObj->lang = "en";
$id = count($jsonarray['packages'])+1;
$myObj->id = $id;
$myObj->soon = false;
$myObj->date = $_POST["date"];
$myObj->creator = $_POST["creator"];
$myObj->creator_institution = $_POST["creator_institution"];
$myObj->keywords = $_POST["keywords"];
$myObj->data = $_POST["data"];
$myJSON = json_encode($myObj);
echo $myJSON;
array_push($myJSON,$jsonarray['packages']);
//here I got: Warning: array_push() expects parameter 1 to be array, string given
$jsondata = json_encode($jsonarray, true);
$myFile = 'materialsdb/'.$_POST["materialtype"].'.json';
if(file_put_contents($myFile, $jsondata)) {
echo 'Data successfully saved';
} else
echo "error";
当我尝试保存它时,它被保存,但是没有修改,没有新对象,但是在我echo $myJSON
的地方,对象看起来不错。
以下是我的.json
文件的示例:
{
"description": "some description",
"creators": [
{
"name": "cname",
"whoishe": "cv",
"avatar": "",
"id": 123
}
],
"lang": "en",
"materialname": "mat name",
"generalmaterialid": "mat_id",
"thismaterialid": "this_mat_id",
"packages": [
{
"short": "pack short desc",
"title": "pack title",
"description": "pack long desc",
"cover": "pack cover",
"VR": true,
"slow": true,
"2D": true,
"3D": true,
"license": "free",
"lang": "en",
"id": 1,
"soon": false
}
]
}
我从https://www.w3schools.com/js/js_json_php.asp和http://www.kodecrash.com/javascript/read-write-json-file-using-php/这里受到启发。
我在这里做错了什么?我该如何解决?在这种情况下正确的版本是什么?感谢您的帮助!
答案 0 :(得分:0)
首先,您将array_push()
的论点摆到最前面。您要插入的数组必须是您赋予该函数的第一个参数。
第二,您要向数组添加JSON字符串($myJSON
),而不是对象数据。这是行不通的,因为当您以后将整个数组编码为JSON时,已经是JSON字符串的位将被简单地视为一个字符串,并最终被双重编码。您需要将实际的PHP对象推送到数组。其他所有内容都将在以后进行编码。
所以
$myJSON = json_encode($myObj);
echo $myJSON;
array_push($myJSON,$jsonarray['packages']);
可以变得简单
array_push($jsonarray['packages'], $myObj);
P.S。您还可以通过编写
来消除有关“从空值创建默认对象”的警告$myObj = new \stdClass();
就在行前
$myObj->short = $_POST["short"];
以便将属性添加到已经存在的对象中。