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

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

تحوّل json_decode($json, true) نص JSON إلى مصفوفة ترابطية في PHP؛ ودون true تحصل على كائنات stdClass. تعلّم القيم المتداخلة، ومعالجة الأخطاء بـ JSON_THROW_ON_ERROR، وjson_validate()، ولماذا تعيد json_decode القيمة null.

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

تحوّل json_decode($json, true) نص JSON إلى قيم PHP، مع كل كائن JSON مصفوفةً ترابطية. احذف true فتصبح كائنات JSON كائنات stdClass بدلًا من ذلك، تُقرأ بـ ->. ويعطي JSON غير الصالح null.

المخرجات:

Ada
js
Ada
php
Array
(
    [name] => Ada
    [age] => 36
    [langs] => Array
        (
            [0] => php
            [1] => js
        )

    [admin] => 1
)

تصبح مصفوفات JSON دائمًا قوائم PHP، أيًّا كان الوضع الذي تختاره. والاتجاه المعاكس، من PHP إلى JSON، هو json_encode().

مصفوفة ترابطية أم كائن: true مقابل false

يحمل الوضعان البيانات نفسها؛ اختر الذي يُقرأ أفضل في شيفرتك. تعمل المصفوفات مع كل دوال المصفوفات (array_column وarray_map وisset($data['key']))، لذا تمرر معظم الشيفرات true. وتحتاج الكائنات إلى صيغة الأقواس المعقوصة للمفاتيح التي ليست أسماء خصائص صالحة، مثل المفاتيح التي فيها شرطة أو رقم:

المخرجات:

Ada zero London
Ada zero London
object(stdClass)#2 (1) {
  ["city"]=>
  string(6) "London"
}

يأخذ المعامل الرابع أعلامًا. يعطي JSON_OBJECT_AS_ARRAY مصفوفات أيضًا، لكن فقط ما دام الوسيط الثاني null (قيمته الافتراضية): تعيد json_decode($json, flags: JSON_OBJECT_AS_ARRAY) مصفوفات، بينما ما زالت json_decode($json, false, 512, JSON_OBJECT_AS_ARRAY) تعيد كائنات.

المرور على JSON متداخل

استجابات الواجهات البرمجية عادة قائمة من الكائنات داخل كائن. فك الترميز مرة واحدة، ثم امشِ عليه بـ foreach، واستخدم ?? للحقول التي قد تكون مفقودة:

المخرجات:

#1 Ada <ada@example.com> roles: admin, editor
#2 Linus <no email> roles: none
#3 Grace <grace@example.com> roles: editor
Array
(
    [1] => Ada
    [2] => Linus
    [3] => Grace
)

معالجة JSON غير الصالح

تعيد json_decode() القيمة null لـ JSON غير الصالح، لكن null هي أيضًا النتيجة الصحيحة لنص JSON null، لذا لا تخبرك null وحدها إن كان قد فشل. تعطي json_last_error_msg() سبب الاستدعاء الأخير. والطريقة الأنظف هي JSON_THROW_ON_ERROR، التي ترمي JsonException:

المخرجات:

NULL
Syntax error
NULL
No error
Invalid JSON: Syntax error

الوسيط الثالث، 512، هو أقصى عمق للتداخل (القيمة الافتراضية). ومع الوسائط المسماة يمكنك تخطيه: json_decode($json, true, flags: JSON_THROW_ON_ERROR).

التحقق من أن نصًا JSON صالح بـ json_validate()

أضافت PHP 8.3 الدالة json_validate(). تجيب بـ true أو false دون بناء المصفوفات المفكوكة، لذا تستهلك ذاكرة أقل من فك الترميز حين لا تحتاج إلا إلى نعم أو لا، مثلًا لرفض جسم طلب مبكرًا:

المخرجات:

'{"a": 1}'    valid
'[1, 2, 3]'   valid
'"text"'      valid
'{a: 1}'      invalid: Syntax error
'{\'a\': 1}'  invalid: Syntax error
''            invalid: Syntax error

إذا كنت ستستخدم البيانات على أي حال، فتخطَّ json_validate() وفك الترميز مع JSON_THROW_ON_ERROR: فالتحقق أولًا يحلل النص مرتين.

قراءة ملف JSON

اقرأ الملف بـ file_get_contents() وفك ترميز النص. تكتب هذه الكتلة settings.json أولًا ليوجد ملف للقراءة:

المخرجات:

Theme: dark
Plugins: 2
{
    "theme": "dark",
    "fontSize": 16,
    "plugins": [
        "git",
        "lint"
    ]
}

لماذا تعيد json_decode القيمة null: الأسباب المعتادة

JSON أكثر صرامة من صيغة JavaScript وصيغة مصفوفات PHP. كل نص أدناه يبدو معقولًا وكل واحد منها يعيد null. شغّله لترى سبب كل منها، ثم أصلح واحدًا وشغّله مرة أخرى:

المخرجات:

single quotes    Syntax error
unquoted key     Syntax error
trailing comma   Syntax error
comment          Syntax error
byte order mark  Syntax error
too deep         Maximum stack depth exceeded
float(1.2345678901234567E+19)
string(20) "12345678901234567890"

علامة ترتيب البايتات غير مرئية في معظم المحررات وهي السبب الكلاسيكي لملف JSON «يبدو سليمًا» لكنه لا يُفك ترميزه. احذفها بـ $text = preg_replace('/^\xEF\xBB\xBF/', '', $text); قبل فك الترميز.

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

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

مرّر true وسيطًا ثانيًا: تعيد json_decode('{"name":"Ada"}', true) المصفوفة ['name' => 'Ada']، فتقرأ القيم بـ $data['name']. ودون true، تصبح كائنات JSON كائنات stdClass وتكتب $data->name.

لماذا تعيد json_decode القيمة null؟

JSON غير صالح (علامات تنصيص مفردة، أو فاصلة ختامية، أو مفاتيح دون علامات تنصيص، أو علامة ترتيب البايتات)، أو متداخل أعمق من حد العمق، أو أن JSON فعلًا null. افحص json_last_error_msg()، أو فك الترميز مع JSON_THROW_ON_ERROR لتحصل على JsonException مع السبب.

كيف أتحقق من أن نصًا JSON صالح في PHP؟

منذ PHP 8.3، تعيد json_validate($string) القيمة true أو false دون بناء القيمة المفكوكة. وفي الإصدارات الأقدم، فك الترميز وافحص json_last_error() === JSON_ERROR_NONE.

كيف أقرأ ملف JSON في PHP؟

اقرأ الملف، ثم فك ترميزه: $data = json_decode(file_get_contents('data.json'), true, flags: JSON_THROW_ON_ERROR);. تعيد file_get_contents() القيمة false إذا كان الملف مفقودًا، فافحص ذلك أولًا.

كيف أصل إلى مفتاح JSON فيه شرطة في PHP؟

فك الترميز إلى مصفوفة واستخدم $data['first-name']، أو مع الكائنات استخدم الأقواس المعقوصة: $obj->{'first-name'}. وتعمل صيغة الأقواس نفسها مع المفاتيح التي هي أعداد، مثل $obj->{'0'}.

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

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

ابدأ الآن