كل ما تحتاج الى معرفته عن بيانات JSON + سحب معلومات العملات الرقمية من منصة Binance


 

ماهي بيانات JSON

JSON هي اختصار ل JavaScript Object Notation استلهمت من لغة ال JavaScript وتستخدم الان في الكثير من لغات البرمجة من ضمنها لغة بايثون. تستخدم json لتخزين البيانات وترتيبها بشكل يسمح لنا الرجوع الى هذه البيانات في المستقبل وفهمها وتحليلها بطريقة سهلة.


فمثلا، اذا كنت تكتب لعبة واردت حفظ الاعدادات المفضلة لكل لاعب، ستحتاج الى طريقة لحفظ هذه الاعدادات  مرة واحدة والرجوع اليها في كل مرة يلعب هذا اللاعب بهذا اللعبة دون الحاجة الى سؤال اللاعب عن اعداداته المفضلة في كل مرة يرغب فيها باللعب. غالبا ستستخدم ملفات  json لحفظ هذه الاعدادات.

كمثال على هذه الاعدادات، اذا كنت تستخدم ال Visula Studio Code لكتابة البرامج فانك ستجد جميع اعداداتك في ملف settings.json. لفتح هذا الملف:

 

 اضغط على F1 

 اطبع open settings

اختار open settings (JSON)

يحتوي هذا الملف على جميع اعدادتك المفضلة ويستخدم Visual Studio Code هذا الملف لعرض اعدادتك المفضلة كل مرة تفتح بها هذا البرنامج. الامثلة والاستخدامات ل json كثيرة ولكن يجدر القول بأنها من اهم انواع البيانات التي يجب عليك اتقانها اذا كنت ترغب بسحب البيانات من الانترنت. فلنبدأ بالتعرف عليها وعلى طرق التعامل معها

لدي هنا المتغير quiz يحتوي على بيانات من نوع string مكتوبة بصيغة معينة تشبه في شكلها القواميس بلغة بايثون. أنصحك بمشاهدة موضوع القواميس في بايثون حتى تفهم json بشكل كامل.

quiz = {
    "quiz": {
        "sport": {
            "q1": {
                "question": "Which one is correct team name in NBA?",
                "options": [
                    "New York Bulls",
                    "Los Angeles Kings",
                    "Golden State Warriros",
                    "Huston Rocket"
                ],
                "answer": "Huston Rocket"
            }
        },
        "maths": {
            "q1": {
                "question": "5 + 7 = ?",
                "options": [
                    "10",
                    "11",
                    "12",
                    "13"
                ],
                "answer": "12"
            },
            "q2": {
                "question": "12 - 8 = ?",
                "options": [
                    "1",
                    "2",
                    "3",
                    "4"
                ],
                "answer": "4"
            }
        }
    }
}

ملاحظة: لكتابة string على اكثر من سطر نستخدم ثلاث علامات تنصيص في البداية وثلاث علامات تنصيص في النهاية.

اذا نظرنا الى هذا ال string نجد انه ابتدأ بقوس مجعد وانتهى بقوس مجعد ({ }) كالقواميس تمام.

يحتوي هذا القاموس على مفتاح key واحد وهو quiz  وقيمة هذا المفتاح هي عبارة عن قاموس اخر يحتوي على نوعين من الاسئلة. النوع الاول اسئلة رياضية والنوع الثاني اسئلة رياضيات. يحتوي كل سؤال على السؤال نفسه والاختيارت من نوع list والجواب الصحيح.

لنقم بتحويل هذا المتغير الى json حتى يسهل علينا التعامل معه.

علينا اول استيراد مكتبة json  وهي مكتبة من ضمن مكتبات بايثون الاساسية ولا نحتاج الى تنزيلها.

import json

لتحويل المتغير quiz_string الى json  سنستخدم json.loads(). يرمز حرف ال s في نهاية كلمة loads الى انه سنقوم بتحويل المتغير من  string الى json

quiz_json = json.loads(quiz_string)
print(quiz_json)

اذا ما قمنا بطباعة نوع هذا المتغير.

print(type(quiz_json))

سنلاحظ ان هذا المتغير قد اصبح من نوع dict اي قاموس. لو نظرنا الى مكتبة json سنجد انها تقوم بتحويل البيانات كما يلي:

Python JSON
dict object
list array
str string
int number (int)
float

number (real)

True true
False false
None null

الأن يمكننا التعامل مع هذا المتغير كما لو كان قاموس عادي. فمثلا يمكننا طباعة تصنيفات الاسئلة (sports & maths) كما يلي:

for category in quiz_json["quiz"]:
    print(category)

 

مثال آخر: لنقم بطباعة السؤال الأول والاختيارات والجواب الصحيح كما يلي:

question = quiz_json["quiz"]["sport"]["q1"]["question"]
choices = quiz_json["quiz"]["sport"]["q1"]["options"]
answer = quiz_json["quiz"]["sport"]["q1"]["answer"]
print(f"question: {question}")
print(f"choices: {choices}")
print(f"Correct answer: {answer}")

 

لاحظ ان تصنيف الرياضيات يحتوي على سؤالين. لنقم بحذف السؤال الثاني وتحويل هذا ال json الى string مرة اخرى.

del quiz_json["quiz"]["maths"]["q2"]

لتحويل ال json الى string  سنستخدم ال json.dumps() كما يلي:

new_quiz_string = json.dumps(quiz_json)
print(new_quiz_string)
print(type(new_quiz_string))

لاحظ انه قد تم حذف السؤال الثاني من تصنيف الرياضيات. لاحظ ايضا ان نوع المتغير قد تحول الى string.

حتى يصبح هذا ال string سهل القراءة، يمكننا اضافة عامل اخر الى ال json.dumps() وهو عامل ال indent كما يلي:

new_quiz_string = json.dumps(quiz_json, indent=2)
print(new_quiz_string)

الى الآن كنا نتعامل مع json كمتغيرات. سنشرح في هذا القسم كيف نتعامل مع ملفات json ونخزن بيانات json كملفات دائمة على حاسبك. 

سنستخدم في هذا القسم ملف crypto.json والذي قمنا بسحبه من منصة Binance لتداول العملات الرقمية باستخدام ال API الخاص بالمنصة و مكتبة requests الخاصة بالبايثون. يمكنك تحميل الملف من هنا او باستخدام الكود التالي:

import json
import requests
r = requests.get("https://api.binance.com/api/v3/exchangeInfo")
with open("crypto.json", "w") as f:
    json.dump(r.json(), f)

ملاحظة: مكتبة ال requests ليست من ضمن المكتبات الاساسية في بايثون وعليك تنزليها باستخدام ال pip

عند فتح هذا الملف ستجد كمية ضخمة من البيانات. لنقم بقراءة المفاتيح في هذا الملف لنتعرف على طبيعة البيانات الموجودة في هذا الملف.

with open("crypto.json", "r") as f:
    crypto_json = json.load(f)
for key in crypto_json:
    print(key)

لاحظ ان هذا ال json يحتوي على 5 مفاتيح (أنواع بيانات). ما يهمنا منها هو المفتاح symbols  والذي يحتوي على معلومات عن كل عملة موجودة على منصة بايننس.

لاحظ ان القيمة لمفتاح symbols هي عبارة عن array of dictionaries  وكما رأينا سابقا فان ال array تترجم الى قائمة list عند تحويلها الى عنصر بايثون. وبالتالي يمكننا معرفة عدد العملات بهذه القائمة بمعرفة طول هذه القائمة:

symbols = crypto_json["symbols"]
print(len(symbols))

نجد ان هذا الملف يحتوي على معلومات 1664 عملة حتى تاريخ تسجيل هذا الفيديو. 

لنقم بطباعة اسم العملة الاولى:

symbol = crypto_json["symbols"][0]["symbol"]
print(symbol)

لنقم الان بطباعة اسماء كل العملات:

for i in range(0, len(crypto_json["symbols"]) - 1):
    print(crypto_json["symbols"][i]["symbol"])

اذا دققت بالعملات الموجودة في هذا ال json ستلاحظ ان بعضها يحتوي على كلمة BULL  او BEAR . تعتمد هذه العملات على الرافعه المالية وهذه التعاملات حرام شرعا في ديننا الاسلامي الحنيف. لنقم بحذف هذه العملات والابقاء على العملات الاخرى واعادة حفظ هذا الملف كملف json.

i = 0
while i < len(crypto_json["symbols"]):
    symbol = crypto_json["symbols"][i]["symbol"]
    if "BEAR" in symbol or "BULL" in symbol:
        crypto_json["symbols"].remove(crypto_json["symbols"][i])
    else:
        i += 1
  
with open("new_crypto.json", "w") as nf:
    json.dump(crypto_json, nf)