Menu
flag Ar iconالعربيةdown icon

الدالة json_encode() في PHP: من مصفوفة أو كائن إلى JSON

تحوّل json_encode($value) مصفوفة PHP أو كائنًا أو قيمة بسيطة إلى نص JSON. تصبح المصفوفات الترابطية كائنات JSON، وتصبح القوائم مصفوفات JSON، وتتحكم أعلام مثل JSON_PRETTY_PRINT وJSON_UNESCAPED_UNICODE في المخرجات.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعيد json_encode($value) نص JSON لقيمة PHP. تصبح المصفوفة الترابطية كائن JSON، وتصبح القائمة (المفاتيح 0, 1, 2...) مصفوفة JSON، وتصبح النصوص والأعداد وtrue وfalse وnull ما يقابلها في JSON.

المخرجات:

{"name":"Ada","age":36,"langs":["php","js"],"admin":true,"manager":null}
string

النتيجة نص عادي، جاهز للإرسال إلى متصفح، أو التخزين في ملف أو عمود قاعدة بيانات، أو التمرير إلى برنامج آخر. ولتحويل JSON مرة أخرى إلى PHP، استخدم json_decode().

طباعة JSON منسقة

تأخذ json_encode() أعلامًا وسيطًا ثانيًا. يضيف JSON_PRETTY_PRINT فواصل أسطر وإزاحة بأربع مسافات، وهذا ما تريده في ملف إعدادات أو سجل تصحيح. واجمع عدة أعلام بـ |:

المخرجات:

{
    "app": "shop",
    "debug": false,
    "db": {
        "host": "localhost",
        "port": 3306
    },
    "tags": []
}

إبقاء النصوص اليابانية ونصوص UTF-8 الأخرى مقروءة

افتراضيًا تكتب json_encode() كل محرف غير ASCII على شكل تسلسل هروب \u وتضع شرطة مائلة عكسية قبل كل /. وكلاهما JSON صالح ويُفك إلى النص نفسه، لكنهما يجعلان المخرجات صعبة القراءة وأطول. يحتفظ JSON_UNESCAPED_UNICODE بالمحارف، ويحتفظ JSON_UNESCAPED_SLASHES بالروابط كما هي:

المخرجات:

{"name":"\u308a\u3093\u3054","price":120,"url":"https:\/\/example.com\/fruit\/apple"}
{"name":"りんご","price":120,"url":"https://example.com/fruit/apple"}

إذا بدا النص الياباني مشوهًا (文字化け) بعد فك الترميز، فالمشكلة ليست في تسلسلات الهروب: النص لم يكن UTF-8 أصلًا. لا تقبل json_encode() إلا UTF-8 وتعيد false لأي شيء آخر، كما يبيّن قسم الأخطاء.

متى تصبح المصفوفة كائنًا بدل قائمة

لا تُرمَّز مصفوفة PHP مصفوفةَ JSON إلا عندما تكون مفاتيحها 0, 1, 2... بالترتيب تمامًا. وأي مفاتيح أخرى تجعلها كائن JSON. وهذا يفاجئ الناس بعد unset() أو array_filter()، اللتين تتركان فجوات في المفاتيح:

المخرجات:

{"0":"apple","2":"cherry"}
["apple","cherry"]
{"1":"a","2":"b"}
[]
{}
{"0":"a","1":"b"}

استدعِ array_values() قبل الترميز كلما كانت الشيفرة المستقبِلة تتوقع قائمة. وإذا كانت تتوقع كائنًا قد يكون فارغًا، فاستخدم new stdClass() أو (object) $array حتى تخرج القيمة الفارغة مع ذلك على شكل {}.

ترميز كائن والتحكم في JSON الخاص به بـ JsonSerializable

يُرمَّز الكائن العادي بخصائصه العامة فقط؛ وتُتخطى المحمية والخاصة. ولتقرر بالضبط شكل الكائن في JSON، نفّذ الواجهة JsonSerializable وأعِد البيانات من jsonSerialize():

المخرجات:

{"name":"Ada","nick":null}
{"date":"2026-03-14 09:30:00.000000","timezone_type":3,"timezone":"UTC"}
{
    "id": 7,
    "total": 19.5,
    "created": "2026-03-14T09:30:00+00:00"
}

يُرمَّز التعداد المدعوم مثل enum Status: string على شكل قيمته ("active"). أما التعداد الخالص فليست له قيمة، فتفشل json_encode() معه برسالة "Non-backed enums have no default serialization".

الأعداد والأعداد العشرية والنصوص الرقمية

تُكتب الأعداد الصحيحة والعشرية أعدادَ JSON، وتبقى النصوص نصوصًا حتى لو احتوت أرقامًا. وثلاثة أعلام تغيّر ذلك:

المخرجات:

{"price":10}
{"price":10.0}
0.30000000000000004
{"qty":"3","id":"007"}
{"qty":3,"id":7}

يحوّل JSON_NUMERIC_CHECK كل نص رقمي، فيخسر معرّف مثل "007" أو رمز بريدي مثل "01234" أصفاره البادئة. حوّل الحقول التي تقصدها بـ (int) بدل استخدامه على مصفوفة كاملة.

json_encode تعيد false: اعثر على الخطأ

تعيد json_encode() القيمة false عندما لا تستطيع ترميز القيمة. والأسباب المعتادة نص ليس UTF-8 صالحًا (نص مقروء من ملف قديم أو قاعدة بيانات Latin-1) والقيمتان العشريتان NAN وINF. تقول json_last_error_msg() ما الخطأ؛ ويجعلها JSON_THROW_ON_ERROR ترمي JsonException بدلًا من ذلك:

المخرجات:

bool(false)
Malformed UTF-8 characters, possibly incorrectly encoded
{"name":"Caf\ufffd"}
{"name":"Café"}
JsonException: Inf and NaN cannot be JSON encoded

JSON_THROW_ON_ERROR هو الخيار الافتراضي الأفضل في الشيفرة الجديدة: فقيمة false التي لا يفحصها أحد ينتهي بها الأمر مخزنة أو مرسلة نصًا فارغًا.

إعادة JSON من واجهة PHP برمجية

السكربت الذي يجيب بـ JSON يضبط ترويسة Content-Type قبل طباعة أي شيء، ويرمّز مرة واحدة، ويتوقف:

<?php
header('Content-Type: application/json; charset=utf-8');

$products = [
    ['id' => 1, 'name' => 'りんご', 'price' => 120],
    ['id' => 2, 'name' => 'みかん', 'price' => 80],
];

echo json_encode(['data' => $products], JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
exit;

وعندما تطبع JSON داخل وسم HTML <script> بدلًا من ذلك، أضف JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT. يحوّل تهريب الشرطة المائلة الافتراضي </script> إلى <\/script>، لكن تلك الحماية تختفي حالما يضيف أحدهم JSON_UNESCAPED_SLASHES، وما زال <!-- في قيمة ما يغيّر طريقة تحليل المتصفح للسكربت. تكتب الأعلام < و> و& و' و" على شكل \u003C و\u003E و\u0026 و\u0027 و\u0022، التي يقرؤها JavaScript مرة أخرى المحارف نفسها.

الأسئلة الشائعة

كيف أحوّل مصفوفة PHP إلى JSON؟

مرّرها إلى json_encode(): تعيد json_encode(['name' => 'Ada', 'age' => 36]) النص {"name":"Ada","age":36}. والمصفوفة ذات المفاتيح 0, 1, 2... بالترتيب تصبح مصفوفة JSON بدلًا من ذلك: تعيد json_encode(['a', 'b']) النص ["a","b"].

كيف أطبع JSON منسقًا في PHP؟

أضف العلم JSON_PRETTY_PRINT: تضيف json_encode($data, JSON_PRETTY_PRINT) إزاحة بأربع مسافات وتضع كل قيمة في سطرها. واجمع الأعلام بـ |، مثل JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE.

لماذا تحوّل json_encode النص الياباني إلى رموز \u؟

افتراضيًا يُكتب كل محرف غير ASCII على شكل تسلسل هروب \uXXXX، فتصبح りんご النص \u308a\u3093\u3054. وما زال JSON صالحًا، لكن مرّر JSON_UNESCAPED_UNICODE لتبقى المحارف مقروءة.

لماذا تعيد json_encode القيمة false؟

غالبًا لأن نصًا ما ليس UTF-8 صالحًا، أو لأن البيانات تحتوي NAN أو INF. استدعِ json_last_error_msg() لترى السبب، أو مرّر JSON_THROW_ON_ERROR لترمي JsonException بدل إعادة false.

كيف أجعل json_encode تخرج {} بدل [] لمصفوفة فارغة؟

تُرمَّز مصفوفة PHP الفارغة دائمًا على شكل []. استخدم new stdClass() أو (object) [] لكائن فارغ، أو العلم JSON_FORCE_OBJECT، الذي يحوّل كل مصفوفة في القيمة إلى كائن.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن