创建一个对象并将其添加到json以保存文件

时间:2018-07-30 09:52:27

标签: php arrays json object

我有一个.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.asphttp://www.kodecrash.com/javascript/read-write-json-file-using-php/这里受到启发。

我在这里做错了什么?我该如何解决?在这种情况下正确的版本是什么?感谢您的帮助!

1 个答案:

答案 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"];

以便将属性添加到已经存在的对象中。