الدالة json_decode()‎ في PHP

من موسوعة حسوب
< PHP
مراجعة 02:46، 10 أبريل 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (إضافة تصنيفات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

(PHP 5 >= 5.2.0, PHP 7, PECL json >= 1.2.0)

تفك الدالة json_decode()‎ ترميز سلسلة نصية بصيغة JSON.

الوصف

mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0]]] )

تأخذ سلسلة مُرمَّزة بصيغة JSON وتحوِّلها إلى مُتغيِّر PHP.

المعاملات

json

سلسلة نصية بصيغة JSON التي سيُفكُّ ترميزها.

تعمل هذه الدّالّة مع سلاسل نصّيّة مُرمَّزة بترميز UTF-8 فقط.

ملاحظة: تعتمد PHP مجموعة عُليا من JSON كما هو مُحدَّد في المعيار الأصلي RFC 7159.

assoc

عندما تكون قيمته صحيحة TRUE، فستُحوَّل الكائنات المُعادة من الدّالّة إلى مصفوفات ترابطية (associative arrays).

depth

عُمق المُعاوَدة (recursion) المُحدَّد من قبل المستخدم.

options

خيارات لفك ترميز JSON على شكل قناع بت Bitmask. هناك حاليًّا خياران مدعومان، الأوّل هو JSON_BIGINT_AS_STRING والذي يسمح بقلب الأعداد الصّحيحة الكبيرة إلى سلاسل نصّيّة بدلًا من أعداد ذات فاصلة عائمة float، وهو الخيار الافتراضي، الخيار الثّاني هو JSON_OBJECT_AS_ARRAY وله نفس تأثير تعيين قيمة المُعامِل assoc إلى TRUE.

القيم المعادة

تُعيد هذه الدّالّة القيمة المُرمَّزة في المُعامِل json إلى نوع مناسب في لغة PHP، تُعاد القيم true و false و null على شكل TRUE و FALSE و NULL على التوالي وبالتّرتيب. تُعاد القيمة NULL في حال تعذّر فك ترميز سلسلة JSON أو كانت البيانات المُرمَّزة أعمق من حدّ المُعاوَدة.

أمثلة

المثال 1: أمثلة على استخدام الدالة json_decode()

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

ينتج عن المثال السّابق ما يلي:

object(stdClass)#1 (5) {
 	["a"] => int(1)
 	["b"] => int(2)
 	["c"] => int(3)
 	["d"] => int(4)
 	["e"] => int(5)
}

array(5) {
 	["a"] => int(1)
 	["b"] => int(2)
 	["c"] => int(3)
 	["d"] => int(4)
 	["e"] => int(5)
}

المثال 2: محاولة الوصول إلى خصائص غير صالحة للكائن

للوصول إلى عناصر الكائن التي تحتوي أحرف غير مسموح بها بموجب اتفاقيّة التّسمية في PHP (مثل الشرطة [hyphen]) فنضع اسم العنصر بين قوسين وبين علامتَي اقتباس.

<?php
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345 
?>

المثال 3: أخطاء شائعة عند استخدام ()json_decode

<?php
// السّلاسل النصّيّة التّالية صالحة في جافاسكريبت وغير صالحة في JSON
 
// يجب وضع الاسم والقيمة بين علامتي تنصيص مزدوجتين
// علامات التّنصيص المفردة غير صالحة هنا
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null
 
// يجب وضع الاسم بين علامتي تنصيص مزدوجتين
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null
 
// لا يسمح بوضع الفواصل الزّائدة
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null
 
?>

المثال 4: أخطاء مُعامِل العُمق depth

<?php
// ترميز البيانات
 
$json = json_encode(
    array(
        1 => array(
            'English' => array(
                'One',
                'January'
            ),
            'French' => array(
                'Une',
                'Janvier'
            )
        )
    )
);
 
// تعريف الأخطاء
 
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants["json"] as $name => $value) {
    if (!strncmp($name, "JSON_ERROR_", 11)) {
        $json_errors[$value] = $name;
    }
}
 
// إظهار الأخطاء بحسب اختلاف العمق
 
foreach (range(4, 3, -1) as $depth) {
    var_dump(json_decode($json, true, $depth));
    echo 'Last error: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
}
?>

ينتج عن المثال السّابق ما يلي:

array(1) {
  [1]=>
  array(2) {
        	["English"]=>
        	array(2) {
        	[0]=>
        	string(3) "One"
        	[1]=>
        	string(7) "January"
        	}
        	["French"]=>
        	array(2) {
        	[0]=>
        	string(3) "Une"
        	[1]=>
        	string(7) "Janvier"
        	}
  }
}
Last error: JSON_ERROR_NONE
 
NULL
Last error: JSON_ERROR_DEPTH

المثال 5: استخدام ()json_decode مع أعداد صحيحة كبيرة

<?php
$json = '{"number": 12345678901234567890}';
 
var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));
 
?>

ينتج عن المثال السّابق ما يلي:

object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
  ["number"]=>
  string(20) "12345678901234567890"
}

ملاحظات

خصائص JSON هي ليست JavaScript وإنّما مجموعة فرعيّة من JavaScript.

تُستخدَم الدّالّة ()json_last_error لتحديد طبيعة الخطأ بالضّبط في حال فشل فك التّرميز.

سجل التغيرات

الإصدار الوصف
7.1.0 يُرمَّز مفتاح JSON الفارغ ("") إلى خاصيّة كائن فارغة بدلًا من استخدام مفتاح مع القيمة _empty_.
7.0.0 رُفِضَت صيغ الأعداد غير المتوافقة مع المعيار RFC 7159، وهي المستويات العُليا من الأعداد (07، 0xff، .1، -.1) وكل مستويات الأعداد ([1.]، [1.e1]).
7.0.0 حدوث خطأ في صياغة JSON ناتج عن السّلسلة النصّيّة أو القيمة الفارغة في PHP والتي عند قلبها إلى سلسلة نصّيّة يكون الناتج سلسلة نصّيّة فارغة (NULL، أو FALSE).
5.6.0 لم تعد تُقبَل تنوعات أحرف القيم الثّابتة true و false و null المكتوبة بغير أحرف صغيرة كمُدخلات صالحة، وسيؤدّي استخدامها إلى تحذيرات.
5.4.0 أُضيف المُعامِل options.
5.3.0 أُضيف المُعامِل الاختياري depth، ورُفِعَت القيمة الافتراضيّة لعمق المُعاوَدة من 128 إلى 512.
5.2.3 رُفِعَت قيمة حدّ التداخل من 20 إلى 128.
5.2.1 أُضيف دعم فك ترميز JSON للأنواع الأساسيّة.

انظر أيضًا

مصادر