自动递增 id JSON

Auto increment id JSON

我正在制作一个 RESTful 网络服务,我希望发布到 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 吗

编辑 我发现我一直不清楚我想做什么。

发布到网络服务的数据存储在 .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 给出的,但我希望它是自动递增的。 我希望这能让我的问题更清楚。

虽然不清楚您想要自动递增的内容,但当您的服务器获得 post 时,它可以遍历结果并添加所需的 ID。

毕竟,您不能期望用户为他传递给您的每个数据结构都为您的系统提供一个内部 ID。

就像 mysql 不希望您提供一个 id 如果有一个 id 是自动递增的。

我的建议:循环传入的 json 并应用您自己的 ID,来自数据库或其他。

这取决于您的应用程序。如果您使用的是数据库,您显然应该使用数据库主键值,但如果您将信息存储在简单的 .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);

我在使用 JSON 时遇到了同样的问题,但在我的例子中,它是 JSON 在 MySQL 中,我在其中存储了一些具有唯一 ID 的数据。

第一个示例有效,但是当您需要删除任何值时,下次您添加一个值时它会得到重复的 ID,所以它对我来说效果不佳。

因此,如果您需要 remove/add 值,并且始终确保具有唯一 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);
    "id": "2",
    "title": "Hello World",
    "artist": "John Smith"
    ...

您的 JSON 数据 ID 是字符串。让它像

    "id": 2,
    "title": "Hello World",
    "artist": "John Smith"
    ...