3

我有一个简单的 json 文件,它有一个直接的图像链接和每个 json 对象的文件夹名称:

[
        {
                "image": "http://placehold.it/350x150",
                "folder": "Small"
        },
        {
                "image": "http://placehold.it/450x250",
                "folder": "Medium"
        },
        {
                "image": "http://placehold.it/550x350",
                "folder": "Medium"
        }
]

我想从帖子中附加这两个值,但结果是一个未更改的 json 文件。这是带有注释的 PHP 代码:

$directLink = $_POST['txtDirectLink'];
$category = $_POST['selectCategoriesImages'];
$util->addToJsonImageList($directLink, $category);

//decodes the json image list, merges to the decoded array a new image, then encodes back to a json file
function addToJsonImageList($link, $category) {
    $file = file_get_contents('./images_list.json', true);
    $data = json_decode($file);
    unset($file);

    $newImage = array('image' => $link, 'folder' => $category);
    //$newImage['image'] = $link;
    //$newImage['folder'] = $category;
    $result = array_merge((array)$data, (array)$newImage);

    json_encode($result);
    file_put_contents('./images_list.json', $result);
    unset($result);
}

逻辑是将文件 json_decode 为数组,将新数组合并到该数组上,然后对结果进行编码并放入同一个文件中,应该很简单。我也无法捕捉到任何类型的错误。

4

4 回答 4

9
$data = json_decode($file, true);
//When TRUE, returned objects will be converted into associative arrays.
unset($file);

$newImage = array('image' => $link, 'folder' => $category);
//$newImage['image'] = $link;
//$newImage['folder'] = $category;
$result = array_merge($data, $newImage);
//don't need to cast

参考 PHP json_decode手册

编辑以下代码有效(经过测试)

function addToJsonImageList($link, $category) {
    $file = file_get_contents('./images_list.json', true);
    $data = json_decode($file,true);
    unset($file);
    //you need to add new data as next index of data.
    $data[] = array('image' => $link, 'folder' => $category);
    $result=json_encode($data);
    file_put_contents('./images_list.json', $result);
    unset($result);
}

编辑 2添加了很多错误报告和调试。请让我知道以下输出。下面的代码未经测试(只是在这里输入)。如果您发现任何语法错误,请修复。这里已经很晚了,明天只能查看我的时间,但可以回复。

<?php
//display all errors and warnings
error_reporting(-1);
addToJsonImageList('test link', 'test category');

function addToJsonImageList($link, $category) {
    $file = file_get_contents('./images_list.json', true);
    if ($file===false)die('unable to read file');
    $data = json_decode($file,true);
    if ($data ===NULL)die('Unable to decode');
    unset($file);
    echo "data before\n";
    var_dump ($data);
    //you need to add new data as next index of data.
    $data[] = array('image' => $link, 'folder' => $category);
    echo "data after\n";
    var_dump ($data);
    $result=json_encode($data);
    if (file_put_contents('./images_list.json', $result) === false){
        die('unable to write file');
    }
    unset($result);
}
?>
于 2013-08-19T05:41:14.787 回答
1

假设您有这个名为 (playerJson) 的 .json 文件

{

"Players":
   [
     {"Name":"Arun","Arm":"Gun","num":"1"},
     {"Name":"sssv","Arm":"Arc","num":"2"},
     {"Name":"Surya","Arm":"Bomb","num":"3"},
     {"Name":"sssv","Arm":"Fire","num":"4"}

   ]
}

现在我们在 php (myPhpFile.php) 中要做的是:(我想你是从表单加载数据)

<?php

$json = file_get_contents('playerJson.json');
$json_data = json_decode($json,true);

$newar = array(
           'Name'=>$_POST['nameField'] ,
           'Arm' =>$_POST['armField'],
           'Num' =>$_POST['numField']
);
//saving data in Players object...
array_push($json_data['Players'], $newar);

$json = json_encode($json_data);

file_put_contents('playerJson.json', $json);

?>

就这样 !您的“玩家”对象中有一个新行。但是如果要添加新对象,请避免在array_push 函数中$json_data 之后的[Players]。

于 2016-02-18T15:00:14.533 回答
0

您的问题在于以下代码行

json_encode($result);
file_put_contents('./images_list.json', $result);

您没有捕获结果,json_encode因此您将其array写入文件。

您需要将代码调整为如下所示

$result = json_encode($result);
file_put_contents('./images_list.json', $result);
于 2013-08-19T05:57:41.347 回答
0

你可以做的是解码 json 然后合并它们。

$data = json_decode(file_get_contents(./images_list.json));

$result = array_merge((array)$data, (array)$newImage);

然后只是输出json_encode

file_put_contents('./images_list.json', json_encode($result, JSON_FORCE_OBJECT));
于 2013-08-19T05:37:48.457 回答