使用PHP正确地将多个JSON记录写入JSON文件

3
我有一个简单的JS添加产品功能,我试图使用php将这些产品保存到一个.json文件中。
我的JS中的json对象看起来像:
{id: 1474791226069, name: "prod", brand: "yhh", price: "2"}

我的用于将它们保存在 .json 文件中的 PHP 代码如下:
<?php
$data[] = $_GET['data'];

$inp = file_get_contents('products.json');
$tempArray = json_decode($inp);
array_push($tempArray, $data);
$jsonData = json_encode($tempArray);
var_dump($jsonData);
file_put_contents('products.json', $jsonData);
?>

遗憾的是,我在我的 .json 文件中得到的结果看起来有点奇怪:
[["{\"id\":1474721566304,\"name\":\"GGG\",\"brand\":\"GG\",\"price\":\"3\"}"],["{\"id\":1474721570904,\"name\":\"GGGH\",\"brand\":\"GGH\",\"price\":\"4\"}"],["{\"id\":1474721574188,\"name\":\"GGGH\",\"brand\":\"GGHH\",\"price\":\"5\"}"]]

我发现很难按照ID查找产品并删除或更新它。我知道.json文件不应该看起来像这样,所以我的问题是:如何使我的.json文件看起来像正常的.json文件,同时仍然能够从我的JS附加新的.json记录,就像这样:
[
    {"id":1,"product":"one", "brand":"blah","price":"1"},
    {"id":2,"product":"two", "brand":"blah","price":"2"},
    {"id":3,"product":"three", "brand":"blah","price":"3"}
]

所以我能够添加新的记录,并以更常规的方式进行解码/编码吗?
请帮忙!

执行 var_dump($_GET['data']); 并展示你所获取的内容。 - Rajdeep Paul
1
同时,使用var_dump输出您的$inp和$tempArray变量,以查看数据哪一部分出现了问题。 - Gordon
1
在$inp中,我得到了字符串(237) "[["{"id":1474721566304,"name":"GGG","brand":"GG","price":"3"}"],["{"id":1474721570904,"name":"GGGH","brand":"GGH","price":"4"}"],["{"id":1474721574188,"name":"GGGH","brand":"GGHH","price":"5"}"]]" - Robert Ross
1
$tempArray是一个数组,包含3个元素。每个元素都是一个数组,其中包含一个字符串。这个字符串是一个JSON格式的对象,包含id、name、brand和price四个属性。 - Robert Ross
1
$_GET['data'] 在问题中显示,它是一个像这样的 JSON 对象 {id: 1474791226069, name: "prod", brand: "yhh", price: "2"}。 - Robert Ross
3个回答

4

根据你的评论,$_GET['data'] 是一个json对象,如下所示 {id: 1474791226069, name: "prod", brand: "yhh", price: "2"}

解码json对象时,总是将第二个参数传递为true,以将对象转换为关联数组。此外,您必须使用另一个数组(例如$ resultData)来实现所需的结果。因此,解决方案 如下:

$resultData = $tempArray = array();

$data = json_decode($_GET['data'], true);
if(($inp = file_get_contents('products.json')) != false){
    $tempArray = json_decode($inp, true);
}

array_push($tempArray, $data);
$resultData[] = $tempArray;
$jsonData = json_encode($tempArray);
file_put_contents('products.json', $jsonData);

var_dump($jsonData);

1
谢谢,这会在products.json中生成以下结果:[{"id":1474796685137,"name":"ddd","brand":"ddd","price":"324"},{"id":1474796690417,"name":"ds","brand":"dsd","price":"44"},{"id":1474796699175,"name":"ds34","brand":"dsdg","price":"4434"}],正是我想要的! :) - Robert Ross
1
@joysdepraved 很高兴我能帮到你。 :-) - Rajdeep Paul

0

在调用array_push($tempArray, $data);之后,您应该调用var_dump($tempArray);

也许问题出在数组结构本身。

像这样的代码:

$item['id'] = 1474721566304;
$item['name'] = 'GGG';
$tempArray[] = $item;
$jsonData = json_encode($tempArray);
var_dump($jsonData);

结果会产生以下输出:

string(35) "[{"id":1474721566304,"name":"GGG"}]"

-1

我知道我有点晚了,但我想到了一些东西,这样更方便易懂。希望你也能理解。如果将来有人不理解已接受的代码,他们肯定会理解这个。

代码:

<?php
   //load data
   $data = file_get_contents($_GET['data']);

   //decode json to associative array
   $json_arr = json_decode($data, true);

   //add data
   $json_arr[] = array(
        "id" => 3, 
        "product" => "three", 
        "brand" => "blah", 
        "price" => "3"
   );

   //encode the json and save to file
   file_input_contents('products.json', json_encode($json_arr));

   print_r(json_encode($json_arr));
?>

输出:

[
   {
     "id":3,
     "product":"three", 
     "brand":"blah",
     "price":"3"
   }
]

我只添加了单个数据,但当您添加其他数据时,您将仅获得所需的结果。

谢谢。我希望它对未来的某些人有用。愉快的学习!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接