我正在创建RESTful Web服务,我希望发布到JSON文件的项目具有Id。我一直在寻找,但找不到任何关于如何做到这一点。
JSON看起来像这样
[
{
"id": "2",
"title": "Hello World",
"artist": "John Smith",
"genre": "pop",
"week": "4",
"highest_rating": "3",
"year": "2014",
"youtube": "www",
"links": [
{
"rel": "self",
"href": ""
},
{
"rel": "collection",
"href": ""
}
]
},
{
"id": "3",
"title": "Lorem Ipsum",
"artist": "John Smith",
"genre": "pop",
"week": "4",
"highest_rating": "3",
"year": "2014",
"youtube": "www",
"links": [
{
"rel": "self",
"href": ""
},
{
"rel": "collection",
"href": ""
}
]
}
]
此文件中的ID是硬编码的。 有人可以告诉我如何使用自动增量获取id
修改 我发现在解释我想做什么时我一直不清楚。
发布到Web服务的数据存储在.json文件中。我没有使用数据库。 所以在PHP中,这就是我正在做的事情。
$file = file_get_contents("data.json");
$data = json_decode($file, true);
$data[] = array(
'id'=>$_POST["id"],
'title'=>$_POST["title"],
'artist'=>$_POST["artist"],
'genre'=>$_POST["genre"],
'week'=>$_POST["week"],
'highest_rating'=>$_POST["highest_rating"],
'year'=>$_POST["year"],
'youtube'=>$_POST["youtube"],
"links"=> [ array(
"rel"=>"self",
"href"=>""
),
array(
"rel"=>"collection",
"href"=>""
)
]
);
file_put_contents('data.json',json_encode($data));
所以目前id是通过POST发出的,但是我希望它能通过自动增量给出。 我希望这会让我的问题更清楚。
答案 0 :(得分:2)
这取决于您的申请。如果你正在使用DB,你显然应该使用DB主键值,但是如果你将信息存储在简单的.json文件中,你必须自己声明每一行id。得到最后一个并递增它。
我强烈建议您将此数据存储在数据库而不是文件中。您永远不会遇到事务问题(并发写入文件)。
<强>更新强>
好的,取决于你的代码:
$file = file_get_contents("data.json");
$data = json_decode($file, true);
// Get last id
$last_item = end($data);
$last_item_id = $last_item['id'];
$data[] = array(
'id' => ++$last_item_id,
'title' => $_POST["title"],
'artist' => $_POST["artist"],
'genre' => $_POST["genre"],
'week' => $_POST["week"],
'highest_rating' => $_POST["highest_rating"],
'year' => $_POST["year"],
'youtube' => $_POST["youtube"],
"links" => [
array(
"rel"=>"self",
"href"=>""
),
array(
"rel"=>"collection",
"href"=>""
)
]
);
file_put_contents('data.json',json_encode($data), LOCK_EX);
我们将 LOCK_EX 标记用于acquire an exclusive lock on the file while proceeding to the writing。
如果您不能使用DB,我认为使用flock()函数读取和写入文件会更安全:
$filename = "data.json";
$filesize = filesize($filename);
$fp = fopen($filename, "r+");
if (flock($fp, LOCK_EX))
{
$data = json_decode(fread($fp, $filesize), true);
// Get last id
$last_item = end($data);
$last_item_id = $last_item['id'];
$data[] = array(
'id' => ++$last_item_id,
'title' => 1,
'artist' => 2,
'genre' => 3,
'week' => 4,
'highest_rating' => 5,
'year' => 6,
'youtube' => 7,
"links" => [
array(
"rel" => "self",
"href" => ""
),
array(
"rel" => "collection",
"href" => ""
)
]
);
fseek($fp, 0);
ftruncate($fp, 0);
fwrite($fp, json_encode($data));
flock($fp, LOCK_UN);
}
else
{
echo "Unable to lock file";
}
fclose($fp);
答案 1 :(得分:0)
虽然您不清楚要自动增加的内容,但当您的服务器获得帖子时,它可以迭代结果并添加所需的ID。
毕竟,您不能指望用户为您传递给他的每个数据条目都为您的系统提供内部ID。
就像有一个id是自动增加的内容一样,mysql也不会指望你提供id。
我的建议:循环传入的json并从数据库中应用你自己的id或者不是。
答案 2 :(得分:0)
我遇到了与JSON相同的问题,但就我而言,它是MySQL中的JSON,我存储了一些具有唯一ID的数据。
第一个示例有效,但是当您需要删除任何值时,下次添加值时,它会获得重复的ID,因此它不适合我。
因此,如果您需要删除/添加值,并始终确保拥有唯一ID,我发现这样做的方式很简单。
首先,你获得了所有的ID,array_column函数正在以正确的方式执行
$idsList = array_column($data, 'id');
输出示例:[2,3]
然后,您只需获取数组中的最大值(ID),然后添加值+1。
$auto_increment_id = max($idsList) + 1;
正如我已经说过的那样,你总是会写一个唯一的ID。
那就是干杯!
完整示例取决于您的代码:
$file = file_get_contents("data.json");
$data = json_decode($file, true);
// Get IDs list
$idsList = array_column($data, 'id');
// Get unique id
$auto_increment_id = max($idsList) + 1;
$data[] = array(
'id' => $auto_increment_id,
'title' => $_POST["title"],
'artist' => $_POST["artist"],
'genre' => $_POST["genre"],
'week' => $_POST["week"],
'highest_rating' => $_POST["highest_rating"],
'year' => $_POST["year"],
'youtube' => $_POST["youtube"],
"links" => [
array(
"rel"=>"self",
"href"=>""
),
array(
"rel"=>"collection",
"href"=>""
)
]
);
file_put_contents('data.json',json_encode($data), LOCK_EX);