php / php/php-src

json_file_encode()/json_file_decode(): provide a higher‑level, file‑oriented shortcut

Open
#22,137 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Extension: json Feature Status: Needs Triage
Dominant language
C
Stars
40.4k
Forks
8.1k
Avg merge
2d 13h
Merged PRs (30d)
96

Description

Description
Motivation

To load a text file into an array PHP already provides file().
For JSON, however, the common pattern is more verbose:

$data = json_decode(file_get_contents($file), true);

This combination is used so often that it deserves its own pair of helper functions.


Proposed functions
  1. json_file_decode(string $fileName[, ?bool $object = true]): array|object|false
  2. json_file_encode(string $fileName, array $array): true|false

These functions are meant as convenience wrappers around json_decode and json_encode + file I/O, modeled after helpers such as file().


Behavior and rationale
json_file_decode
  • Reads the contents of $fileName and decodes it as JSON in one call.
  • The optional $object parameter mirrors json_decode’s second argument:
    • true (default): return an associative array.
    • false: return objects.
    • null: treated as true (array), for consistency with json_decode.
  • Returns the decoded value (array or object) on success, or false on failure (file not readable, missing, or invalid JSON).
  • On failure, it does not throw by default; consumers can check the return value and inspect json_last_error() / json_last_error_msg() for details.
json_file_encode
  • Encodes $array to a JSON string and writes it to $fileName in a single call.
  • Returns true on success, false on failure (encoding error or I/O error).
  • The implementation should use an atomic‑style write (write to temporary file in the same directory, then rename) to avoid partial writes or corruption.
  • Future versions could extend this with flags for options such as pretty‑printing or different JSON constants, but the initial API stays minimal.

Example usage
// Read JSON file into array
$data = json_file_decode('/path/to/config.json');
if ($data === false) {
    die('Failed to load or parse JSON.');
}

// Read JSON file into object
$obj = json_file_decode('/path/to/data.json', false);
if ($obj === false) {
    die('Failed to load or parse JSON.');
}

// Write array back to JSON file
if (!json_file_encode('/path/to/data.json', $data)) {
    die('Failed to write JSON.');
}

Sample PHP implementation
<?php
/**
 * Read a JSON file and decode it into an array or object.
 *
 * @param string $fileName Path to the JSON file.
 * @param bool|null $object If true, return associative array; if false, return objects.
 *                         If null, default to true (array).
 * @return array|object|false Decoded data, or false on error.
 */
function json_file_decode(string $fileName, ?bool $object = true): array|object|false
{
    // Treat null as true (array) for consistency with json_decode.
    $assoc = ($object === null) ? true : !$object;

    if (!is_readable($fileName)) {
        return false;
    }

    $json = @file_get_contents($fileName);
    if ($json === false) {
        return false;
    }

    $data = json_decode($json, $assoc);
    return ($data === null && json_last_error() !== JSON_ERROR_NONE) ? false : $data;
}

/**
 * Encode an array as JSON and write it to a file.
 *
 * @param string $fileName Path to the JSON file.
 * @param array $array Data to encode and write.
 * @return bool True on success, false on failure.
 */
function json_file_encode(string $fileName, array $array): bool
{
    $json = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    if ($json === false) {
        return false;
    }

    // Use a temporary file in the same directory for atomic‑style write.
    $dir = dirname($fileName);
    $temp = tempnam($dir, 'json_');
    if ($temp === false) {
        return false;
    }

    $ok = file_put_contents($temp, $json) !== false;
    if ($ok) {
        $ok = rename($temp, $fileName);
    }

    if (!$ok && file_exists($temp)) {
        @unlink($temp);
    }

    return $ok;
}

Compatibility and naming
  • The proposed names are descriptive and follow PHP naming conventions for file helpers.
  • Return false on failure, consistent with file_get_contents and similar functions.
  • The functions do not replace json_decode / json_encode but provide a higher‑level, file‑oriented shortcut for one of the most common patterns with JSON in PHP.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reviewing the existing json_decode(), json_encode(), file_get_contents(), and file_put_contents() APIs described in the issue. Determine the appropriate implementation and tests for the proposed file-oriented helpers, including decode failures, encoding or I/O failures, and atomic-style writes; done means both functions meet the stated signatures and behaviors.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
backend
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.