سؤال

أحاول تشفير البيانات إلى JSON في بيثون وتمتلك مشكلة كبيرة. أعتقد أن المشكلة هي ببساطة سوء فهم.

أنا جديد نسبيا في بيثون ولا تعرف أبدا عن أنواع بيانات Python المختلفة، لذلك من المرجح أن يصادفني.

حاليا أنا أعلن قائمة، حلقات من خلال وقائمة أخرى، وإلحاق قائمة واحدة داخل آخر:

import simplejson, json
data = [['apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]

x = simplejson.loads(data)
# >>> typeError: expected string or buffer..

x = simplejson.dumps(stream)
# >>> [["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]
# - shouldn't JSON encoded strings be like: {{"apple":{"cat"},{"banana":"dog"}}

لذلك أنا أيضا:

  • أنا لا أفهم بناء جملة JSON
  • أنا لا أفهم وحدة (وحدات) json pythons
  • أنا أستخدم نوع بيانات غير مناسب.
هل كانت مفيدة؟

المحلول

بيثون lists ترجمة إلى json. arrays. وبعد ما يعطيك هو سلسلة JSON صالحة تماما يمكن استخدامها في تطبيق JavaScript. للحصول على ما توقعته، ستحتاج إلى استخدام dict:

>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "apple": "cat", "banana": "dog"}'

نصائح أخرى

أعتقد أنك تبادل ببساطة مقالب و الأحمال.

>>> import json
>>> data = [['apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]

الإرجاع الأول كسلسلة (json المشفرة) وسيطة البيانات الخاصة به:

>>> encoded_str = json.dumps( data )
>>> encoded_str
'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'

والثاني يقوم العكس بالعكس، وإرجاع البيانات المقابلة ل Wrgent String String (JSON المشفرة):

>>> decoded_data = json.loads( encoded_str )
>>> decoded_data
[[u'apple', u'cat'], [u'banana', u'dog'], [u'pear', u'fish']]
>>> decoded_data == data
True

في simplejson (أو المكتبة json في بيثون 2.6 والإصدارات الأحدث)، loads يأخذ سلسلة JSON وإرجاع هيكل بيانات Python، dumps يأخذ بنية بيانات بيثون وإرجاع سلسلة JSON. يمكن ل JSON سلسلة تشفير صفائف JavaScript، وليس فقط كائنات، وقائمة Python تتوافق مع سلسلة JSON ترميز صفيف. للحصول على سلسلة JSON مثل

{"apple":"cat", "banana":"dog"}

كائن بيثون الذي تمر json.dumps ممكن ان يكون:

dict(apple="cat", banana="dog")

على الرغم من أن سلسلة JSON هي أيضا بناء جملة Python ساري المفعول dict. وبعد أعتقد أن السلسلة المحددة التي تقول أنك تتوقع ببساطة بناء جملة JSON غير صالح.

البيانات التي ترميزها هي صفيف بدون مفتاح، لذلك يقوم JSON بتشفيرها باستخدام [] بين قوسين. انظر www.json.org لمزيد من المعلومات حول ذلك. يتم استخدام الأقواس المجعد للقوائم مع أزواج المفتاح / القيمة.

من www.json.org:

تم بناء JSON على هياكلين:

مجموعة من أزواج الاسم / القيمة. في لغات مختلفة، يتم تحقيق ذلك ككائن أو سجل أو بنية أو قاموس وجدول تجزئة أو قائمة مفاتيح أو مجموعة مشتركة. قائمة أمر من القيم المطلوبة. في معظم اللغات، يتم تحقيق ذلك كصفيف أو متجه أو قائمة أو تسلسل.

كائن هو مجموعة غير مرتبة من أزواج الاسم / القيمة. يبدأ كائن ب {(هدفين يسار) وينتهي مع} (هدفين يمين). يتبع كل اسم: (القولون) ويتم فصل أزواج الاسم / القيمة، (فاصلة).

مجموعة هي مجموعة أمرية من القيم. يبدأ مجموعة مع [(قوس الأيسر) وينتهي مع] (قوس الأيمن). يتم فصل القيم، (فاصلة).

يستخدم JSON أقواس مربعة للقوائم ( [ "one", "two", "three" ] ) وقواعد مجعد للقواميس الرئيسية / القيمة (تسمى أيضا الكائنات في جافا سكريبت، {"one":1, "two":"b"}).

تفريغ صحيحة تماما، يمكنك الحصول على قائمة بثلاثة عناصر، كل واحدة هي قائمة بأسلوتين.

إذا أردت قاموس، فربما شيء مثل هذا:

x = simplejson.dumps(dict(data))
>>> {"pear": "fish", "apple": "cat", "banana": "dog"}

السلسلة المتوقعة الخاصة بك ('{{"apple":{"cat"},{"banana":"dog"}}') ليست صالحة JSON. أ

لذا، فإن Simplejson.liesloads يأخذ سلسلة JSON وإرجاع بنية بيانات، وهذا هو السبب في أنك تحصل على هذا النوع من الخطأ هناك.

simplejson.dumps (البيانات) تعود مع

'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'

وهي صفيف JSON، وهو ما تريده، لأنك قدمت هذه مجموعة بيثون.

إذا كنت ترغب في الحصول على بناء جملة نوع "كائن"، فبدلا من ذلك

>>> data2 = {'apple':'cat', 'banana':'dog', 'pear':'fish'}
>>> simplejson.dumps(data2)
'{"pear": "fish", "apple": "cat", "banana": "dog"}'

وهو JavaScript سيخرج ككائن.

محاولة:

import simplejson
data = {'apple': 'cat', 'banana':'dog', 'pear':'fish'}
data_json = "{'apple': 'cat', 'banana':'dog', 'pear':'fish'}"

simplejson.loads(data_json) # outputs data
simplejson.dumps(data) # outputs data_joon

ملحوظة: بناء على إجابة باولو.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top