Идентификатор автоинкремента JSON

Я делаю веб-сервис RESTful и хочу, чтобы элементы, размещенные в файле JSON, имели идентификатор. Я искал везде, но не мог найти что-нибудь, как это сделать.

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": ""}
]
}
]

Идентификаторы в этом файле жестко закодированы.
Может кто-нибудь, пожалуйста, скажите мне, как получить идентификаторы с автоинкрементом

редактировать
Я вижу, что мне неясно объяснить, что я хочу сделать.

Данные, которые публикуются в веб-сервисе, хранятся в файле .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));

Таким образом, на данный момент идентификатор дается через POST, но я хочу, чтобы он давался с автоинкрементом.
Я надеюсь, что это проясняет мой вопрос.

1

Решение

Это зависит от вашего приложения. Если вы используете DB, вам, очевидно, следует использовать значение первичного ключа DB, но если вы храните свою информацию в простом файле .json, вы должны объявить каждый идентификатор строки самостоятельно. Получить последний и увеличить его.

Я настоятельно рекомендую вам хранить эти данные в БД, а не в файле. У вас никогда не будет проблем с транзакциями (одновременная запись в файл).

Обновить

ОК, в зависимости от вашего кода:

$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 флаг над получить эксклюзивную блокировку файла при переходе к записи.

Если вы не можете использовать БД, я думаю, что более безопасно читать и записывать файл с стадо() функция:

$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);
2

Другие решения

Из того, что вы хотите автоматически увеличить, пока неясно, когда ваш сервер получает сообщение, он может перебрать результат и добавить требуемый идентификатор.

В конце концов, вы не можете ожидать, что пользователь будет давать вам внутренний идентификатор вашей системы для каждой передаваемой вам строки данных.

Точно так же MySQL не ожидает, что вы предоставите идентификатор, если есть идентификатор, который автоматически увеличивается.

Мое предложение: зациклить на входящем JSON и применить свой собственный идентификатор, из БД или что-то нет.

0

У меня была та же проблема с JSON, но в моем случае это JSON в MySQL, где я храню некоторые данные с уникальными идентификаторами.

Первый пример работает, но когда вам нужно удалить какие-либо значения, в следующий раз, когда вы добавите значение, он получит повторяющиеся идентификаторы, поэтому он не работает для меня должным образом.

Поэтому, если вам нужно удалить / добавить значения и всегда иметь уникальные идентификаторы, я нашел простой способ сделать это.

Во-первых, вы получаете все идентификаторы, функция array_column делает это правильно

$idsList = array_column($data, 'id');

Пример вывода: [2,3]

Затем вы просто получаете самое большое значение (ID) в массиве и добавляете к значению +1.

$auto_increment_id = max($idsList) + 1;

Итак, как я уже сказал, таким образом вы всегда будете писать уникальный идентификатор.

То есть, ура!

Полный пример в зависимости от вашего кода:

$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);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector