PHP の json_encode() および json_decode() を理解する

2025年10月14日

JSON (JavaScript Object Notation) has become the de facto standard for data exchange in modern web development due to its lightweight, human-readable format and compatibility across programming languages. In PHP, two built-in functions—json_encode() そして json_decode()—are essential for working with JSON data. These functions allow developers to convert PHP data structures to JSON strings and vice versa, enabling seamless communication between servers, APIs, and front-end applications. This article dives deep into PHP json_encode() and PHP json_decode(), exploring their syntax, options, use cases, error handling, and best practices.

What Are json_encode() そして json_decode()?

json_encode() function in PHP converts a PHP variable (such as an array or object) into a JSON-formatted string. Conversely, json_decode() takes a JSON string and converts it back into a PHP variable, typically an array or object. These functions are critical for tasks like API development, data storage, and communication between PHP backends and JavaScript frontends.

Why JSON?

JSON is a text-based format that is easy to read and write for humans and simple to parse and generate for machines. Its key advantages include:

  • Language-agnostic: Supported by virtually all programming languages.
  • Lightweight: Smaller payload compared to XML.
  • Structured: Represents complex data structures like arrays and objects in a standardized way.

PHP’s JSON functions bridge the gap between PHP’s native data types and JSON, making them indispensable for modern web applications.

Exploring PHP json_encode()

json_encode() function converts a PHP value into a JSON string. Its basic syntax is:

php
string json_encode(mixed $value, int $flags = 0, int $depth = 512)
  • $value: The PHP value to encode (e.g., array, object, string, number, boolean, or null).
  • $flags: Optional bitmask to modify encoding behavior (e.g., JSON_PRETTY_PRINT, JSON_FORCE_OBJECT).
  • $depth: Maximum nesting depth for encoding (default is 512).

How PHP json_encode() Works

When you pass a PHP variable to json_encode(), it serializes the data into a JSON string. For example:

php
$data = [
    'name' => 'Alice',
    'age' => 30,
    'is_student' => false
];
$json = json_encode($data);
echo $json;

出力:

json
{"name":"Alice","age":30,"is_student":false}

This output is a compact JSON string representing the PHP associative array.

Common PHP json_encode() Options

$flags parameter allows you to customize the encoding process. Some commonly used flags include:

  • JSON_PRETTY_PRINT: Formats the JSON output with indentation and line breaks for readability.
  • JSON_FORCE_OBJECT: Forces arrays (even indexed ones) to be encoded as JSON objects.
  • JSON_NUMERIC_CHECK: Converts numeric strings to numbers in the JSON output.
  • JSON_UNESCAPED_SLASHES: Prevents escaping forward slashes (/).
  • JSON_UNESCAPED_UNICODE: Encodes Unicode characters literally instead of as escape sequences (e.g., “\u00e9” becomes é).

Example with JSON_PRETTY_PRINT:

php
$data = ['name' => 'Bob', 'age' => 25];
$json = json_encode($data, JSON_PRETTY_PRINT);
echo $json;

出力:

json
{
    "name": "Bob",
    "age": 25
}

Handling Complex Data

json_encode() can handle nested arrays and objects. For example:

php
$data = [
    'user' => [
        'name' => 'Charlie',
        'details' => [
            'email' => '[email protected]',
            'active' => true
        ]
    ],
    'scores' => [95, 88, 92]
];
echo json_encode($data, JSON_PRETTY_PRINT);

出力:

json
{
    "user": {
        "name": "Charlie",
        "details": {
            "email": "[email protected]",
            "active": true
        }
    },
    "scores": [95, 88, 92]
}

Limitations and Errors

json_encode() may fail in certain cases, returning false and setting an error code. Common issues include:

  • Invalid UTF-8 characters: JSON requires valid UTF-8 encoding. Non-UTF-8 strings cause encoding to fail.
  • Excessive depth: If the data structure exceeds the $depth limit (default 512), encoding fails.
  • Unsupported types: Resources (e.g., file handles) cannot be encoded.

To debug, use json_last_error() そして json_last_error_msg():

php
$data = ["name" => "\xB1\x31"]; // Invalid UTF-8
$json = json_encode($data);
if ($json === false) {
    echo "Error: " . json_last_error_msg();
}

出力:

Error: Malformed UTF-8 characters, possibly incorrectly encoded

Best Practices for PHP json_encode()

  1. Validate input data: Ensure strings are UTF-8 encoded using utf8_encode() または mb_convert_encoding() if needed.
  2. Use appropriate flags: Choose flags like JSON_PRETTY_PRINT for debugging or JSON_NUMERIC_CHECK/code> for numeric data.
  3. Handle errors: Always check the return value and use json_last_error() to diagnose issues.
  4. Mind the depth: For deeply nested structures, increase the $depth parameter cautiously to avoid stack overflows.

Exploring PHP json_decode()

json_decode() function converts a JSON string into a PHP variable. Its syntax is:

php

mixed json_decode(string $json, bool $assoc = false, int $depth = 512, int $flags = 0)

  • $json: The JSON string to decode.
  • $assoc: If true, returns associative arrays instead of objects for JSON objects.
  • $depth: Maximum nesting depth for decoding (default 512).
  • $flags: Optional flags to modify decoding behavior.

How PHP json_decode() Works

By default, json_decode() converts JSON objects into PHP stdClass objects. For example:

php
$json = '{"name":"David","age":40}';
$data = json_decode($json);
echo $data->name; // Access as object

出力:

David

If you set $assoc = true, JSON objects are converted to associative arrays:

php
$data = json_decode($json, true);
echo $data['name']; // Access as array

出力:

David

Decoding Complex JSON

json_decode() handles nested structures seamlessly:

php
$json = '{
    "user": {
        "name": "Eve",
        "details": {
            "email": "[email protected]",
            "active": true
        }
    },
    "scores": [85, 90, 88]
}';
$data = json_decode($json, true);
echo $data['user']['details']['email'];

出力:

[email protected]

Common PHP json_decode() Options

$flags parameter supports options like:

  • JSON_BIGINT_AS_STRING: Treats large integers as strings to avoid precision loss.
  • JSON_THROW_ON_ERROR: Throws a JsonException on error instead of returning null.

Example with JSON_THROW_ON_ERROR:

php
$json = '{"name":"Frank","age":}'; // Invalid JSON
try {
$data = json_decode($json, false, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo "Error: " . $e->getMessage();
}

出力:

Error: Syntax error

Error Handling

Like json_encode(), json_decode() can fail, returning null ない限り JSON_THROW_ON_ERROR is used. Common errors include:

  • Syntax errors: Malformed JSON (e.g., missing commas or braces).
  • Depth exceeded: JSON structure exceeds the $depth
  • Invalid JSON: Non-JSON input.

用途 json_last_error() to diagnose:

php
$json = '{"name":"Grace",}'; // Invalid JSON
$data = json_decode($json);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
echo "Error: " . json_last_error_msg();
}

出力:

Error: Syntax error

Best Practices for PHP json_decode()

  1. Validate JSON: Use tools like jsonlint or check json_last_error() to ensure valid input.
  2. Choose output type:用途 $assoc = true for arrays if you prefer array access over objects.
  3. Handle large integers:用途 JSON_BIGINT_AS_STRING to avoid precision issues with large numbers.
  4. Use error handling: Prefer JSON_THROW_ON_ERROR for modern PHP applications to catch errors explicitly.

Practical Use Cases

1. Building an API

APIs often return JSON responses. Here’s an example of a PHP API endpoint:

php
header('Content-Type: application/json');
$data = [
    'status' => 'success',
    'data' => [
        'users' => [
            ['id' => 1, 'name' => 'Hannah'],
            ['id' => 2, 'name' => 'Ian']
        ]
    ]
];
echo json_encode($data, JSON_PRETTY_PRINT);

出力:

json
{
    "status": "success",
    "data": {
        "users": [
            {
                "id": 1,
                "name": "Hannah"
            },
            {
                "id": 2,
                "name": "Ian"
            }
        ]
    }
}

2. Consuming an API

When fetching JSON from an API, use json_decode() to process the response:

php
$json = file_get_contents('https://api.example.com/users');
$data = json_decode($json, true);
if (isset($data['users'])) {
    foreach ($data['users'] as $user) {
        echo $user['name'] . "\n";
    }
}

3. Storing Configuration

JSON is ideal for storing configuration data:

php
$config = [
    'db' => [
        'host' => 'localhost',
        'user' => 'root',
        'pass' => 'secret'
    ]
];
file_put_contents('config.json', json_encode($config, JSON_PRETTY_PRINT));

// Read later
$json = file_get_contents('config.json');
$config = json_decode($json, true);
echo $config['db']['host']; // localhost

Common Pitfalls and Solutions

  1. Encoding Non-UTF-8 Data:
    • Problem: json_encode() fails with invalid UTF-8 characters.
    • 解決: Convert strings to UTF-8 using utf8_encode() または mb_convert_encoding().
  2. Large Integer Precision:
    • Problem: Large integers lose precision when decoded as floats.
    • 解決:用途 JSON_BIGINT_AS_STRINGjson_decode().
  3. Invalid JSON Input:
    • Problem: json_decode() 収益 null for malformed JSON.
    • 解決: Validate JSON and use json_last_error() または JSON_THROW_ON_ERROR.
  4. Deep Nesting:
    • Problem: Exceeding the default depth limit (512).
    • 解決: Increase $depth cautiously, e.g., json_encode($data, 0, 1024).

パフォーマンスに関する考察

  • Memory Usage: Large datasets can consume significant memory during encoding/decoding. Use generators or streaming for massive datasets.
  • スピード: json_encode() そして json_decode() are highly optimized, but avoid unnecessary conversions. Cache JSON results when possible.
  • Validation: Pre-validate data to avoid redundant encoding attempts.

結論

json_encode() そして json_decode() functions are powerful tools in PHP for working with JSON data. Whether you’re building APIs, consuming external services, or storing structured data, these functions provide a robust and flexible way to handle JSON. By understanding their options, error handling, and best practices, you can avoid common pitfalls and write efficient, reliable code. Experiment with the examples provided, explore the various flags, and leverage these functions to streamline your PHP applications.

主役として PHP開発会社, カーマテック specializes in building dynamic, scalable, and high-performing web applications using PHP and related technologies. With deep expertise in frameworks and core PHP functionalities, our developers ensure your applications are optimized for speed, security, and seamless data handling — empowering your business to deliver exceptional digital experiences.