الفرق بين المراجعتين لصفحة: «PHP/json decode»

من موسوعة حسوب
< PHP
ط إضافة تصنيفات
 
(12 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
== الدالة <code>json_decode()</code> في PHP ==
<noinclude>{{DISPLAYTITLE:الدالة <code>json_decode()</code>في PHP}}</noinclude>
(PHP 5 >= 5.2.0, PHP 7, PECL json >= 1.2.0)
(PHP 5 >= 5.2.0, PHP 7, PECL json >= 1.2.0)


تفك الدالة <code>json_decode()‎</code> ترميز سلسلة نصية بصيغة JSON.
تفك الدالة <code>json_decode()‎</code> ترميز سلسلة نصية بصيغة JSON.
 
== الوصف ==
=== الوصف ===
<syntaxhighlight lang="php">mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0]]] )</syntaxhighlight>
<code>mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0]]] )</code>


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


=== المعاملات ===
== المعاملات ==


==== <code>json</code> ====
=== <code>json</code> ===
[[Http://php.net/manual/en/language.types.string.php|سلسلة]] json التي سيُفكُّ ترميزها.
[[PHP/Types/string|سلسلة نصية]] بصيغة JSON التي سيُفكُّ ترميزها.


تعمل هذه الدّالّة مع سلاسل نصّيّة مُرمَّزة بترميز UTF-8 فقط.
تعمل هذه الدّالّة مع سلاسل نصّيّة مُرمَّزة بترميز UTF-8 فقط.
سطر 18: سطر 17:
'''ملاحظة:''' تعتمد PHP مجموعة عُليا من JSON كما هو مُحدَّد في المعيار الأصلي [http://www.faqs.org/rfcs/rfc7159 RFC 7159].
'''ملاحظة:''' تعتمد PHP مجموعة عُليا من JSON كما هو مُحدَّد في المعيار الأصلي [http://www.faqs.org/rfcs/rfc7159 RFC 7159].


==== <code>assoc</code> ====
=== <code>assoc</code> ===
عندما تكون قيمته صحيحة <code>TRUE</code>، فستُحوَّل الكائنات المُعادة من الدّالّة إلى [http://php.net/manual/en/language.types.array.php مصفوفات] ترابطية (associative arrays).
عندما تكون قيمته صحيحة <code>TRUE</code>، فستُحوَّل [[PHP/object|الكائنات]] المُعادة من الدّالّة إلى [[PHP/array|مصفوفات]] ترابطية (associative arrays).


==== <code>depth</code> ====
=== <code>depth</code> ===
عُمق المُعاوَدة (recursion) المُحدَّد من قبل المستخدم.
عُمق المُعاوَدة (recursion) المُحدَّد من قبل المستخدم.


==== <code>options</code> ====
=== <code>options</code> ===
خيارات لفك ترميز JSON على شكل قناع بت Bitmask. هناك حاليًّا خياران مدعومان، الأوّل هو JSON_BIGINT_AS_STRING والذي يسمح بقلب الأعداد الصّحيحة الكبيرة إلى سلاسل نصّيّة بدلًا من أعداد ذات فاصلة عائمة float، وهو الخيار الافتراضي، الخيار الثّاني هو JSON_OBJECT_AS_ARRAY وله نفس تأثير تعيين قيمة المُعامِل assoc إلى TRUE.
خيارات لفك ترميز JSON على شكل قناع بت Bitmask. هناك حاليًّا خياران مدعومان، الأوّل هو <code>JSON_BIGINT_AS_STRING</code> والذي يسمح بقلب الأعداد الصّحيحة الكبيرة إلى سلاسل نصّيّة بدلًا من أعداد ذات فاصلة عائمة float، وهو الخيار الافتراضي، الخيار الثّاني هو <code>JSON_OBJECT_AS_ARRAY</code> وله نفس تأثير تعيين قيمة المُعامِل <code>assoc</code> إلى <code>TRUE</code>.
 
== القيم المعادة ==
تُعيد هذه الدّالّة القيمة المُرمَّزة في المُعامِل json إلى نوع مناسب في لغة PHP، تُعاد القيم true و false و null على شكل <code>TRUE</code> و <code>FALSE</code> و <code>NULL</code> على التوالي وبالتّرتيب. تُعاد القيمة <code>NULL</code> في حال تعذّر فك ترميز سلسلة JSON أو كانت البيانات المُرمَّزة أعمق من حدّ المُعاوَدة.
 
== أمثلة ==
المثال 1: أمثلة على استخدام الدالة <code>json_decode()</code>‎<syntaxhighlight lang="php">
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
</syntaxhighlight>
ينتج عن المثال السّابق ما يلي:
<syntaxhighlight lang="text">
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)
}
</syntaxhighlight>
المثال 2: محاولة الوصول إلى خصائص غير صالحة للكائن
 
للوصول إلى عناصر الكائن التي تحتوي أحرف غير مسموح بها بموجب اتفاقيّة التّسمية في PHP (مثل الشرطة [hyphen]) فنضع اسم العنصر بين قوسين وبين علامتَي اقتباس.<syntaxhighlight lang="php">
<?php
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345
?>
</syntaxhighlight>المثال 3: أخطاء شائعة عند استخدام <code>()json_decode</code><syntaxhighlight lang="php">
<?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
?>
 
</syntaxhighlight>المثال 4: أخطاء مُعامِل العُمق <code>depth</code><syntaxhighlight lang="php">
<?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;
}
?>
 
</syntaxhighlight>ينتج عن المثال السّابق ما يلي:<syntaxhighlight lang="text">
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
 
</syntaxhighlight>المثال 5: استخدام <code>()json_decode</code> مع أعداد صحيحة كبيرة<syntaxhighlight lang="php">
<?php
$json = '{"number": 12345678901234567890}';
var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));
?>
 
</syntaxhighlight>ينتج عن المثال السّابق ما يلي:<syntaxhighlight lang="text">
object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
  ["number"]=>
  string(20) "12345678901234567890"
}
</syntaxhighlight>
 
== ملاحظات ==
خصائص JSON هي ليست [[JavaScript]] وإنّما مجموعة فرعيّة من [[JavaScript]].
 
تُستخدَم الدّالّة <code>[[PHP/json last error|()json_last_error]]</code> لتحديد طبيعة الخطأ بالضّبط في حال فشل فك التّرميز.
 
== سجل التغيرات ==
{| class="wikitable"
!الإصدار
!الوصف
|-
|7.1.0
|يُرمَّز مفتاح JSON الفارغ <code>("")</code> إلى خاصيّة كائن فارغة بدلًا من استخدام مفتاح مع القيمة <code>_empty_</code>.
|-
|7.0.0
|رُفِضَت صيغ الأعداد غير المتوافقة مع المعيار <nowiki>RFC 7159</nowiki>، وهي المستويات العُليا من الأعداد (07، 0xff، .1، -.1) وكل مستويات الأعداد ([1.]، [1.e1]).
|-
|7.0.0
|حدوث خطأ في صياغة JSON ناتج عن السّلسلة النصّيّة أو القيمة الفارغة في PHP والتي عند قلبها إلى سلسلة نصّيّة يكون الناتج سلسلة نصّيّة فارغة (NULL، أو FALSE).
|-
|5.6.0
|لم تعد تُقبَل تنوعات أحرف القيم الثّابتة true و false و null المكتوبة بغير أحرف صغيرة كمُدخلات صالحة، وسيؤدّي استخدامها إلى تحذيرات.
|-
|5.4.0
|أُضيف المُعامِل <code>options</code>.
|-
|5.3.0
|أُضيف المُعامِل الاختياري <code>depth</code>، ورُفِعَت القيمة الافتراضيّة لعمق المُعاوَدة من 128 إلى 512.
|-
|5.2.3
|رُفِعَت قيمة حدّ التداخل من 20 إلى 128.
|-
|5.2.1
|أُضيف دعم فك ترميز JSON للأنواع الأساسيّة.
|}
 
== انظر أيضًا ==
* الدالة <code>[[PHP/json encode|json_encode()‎]]</code>: إعادة قيمة ما على شكل صيغة JSON.
* الدالة <code>[[PHP/json last error|json_last_error()‎]]</code>: إعادة آخر خطأ حاصل.


==== القيم المعادة ====
== مصادر ==
تُعيد هذه الدّالّة القيمة المُرمَّزة في المُعامِل json إلى نوع مناسب في لغة PHP، تُعاد القيم true و false و null على شكل TRUE و FALSE و NULL على التوالي وبالتّرتيب. تُعاد القيمة NULL في حال تعذّر فك ترميز سلسلة json أو كانت البيانات المُرمَّزة أعمق من حدّ المُعاوَدة.
* [http://php.net/manual/en/function.json-decode.php صفحة الدالة json_decode في توثيق PHP الرسمي].
[[تصنيف:PHP]]
[[تصنيف:PHP Function]]
[[تصنيف:PHP JSON]]

المراجعة الحالية بتاريخ 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 للأنواع الأساسيّة.

انظر أيضًا

مصادر