سؤال

لدي خدمة ويب التي تستخدم بايثون SimpleJSON إلى تسلسل JSON و جافا سكريبت/ العميل الذي يستخدم جوجل التصور API.عند محاولة قراءة في استجابة JSON باستخدام جوجل بيانات الجدول الاستعلام الطريقة ، أنا على الحصول على "بطلان التسمية" خطأ.

لاحظت أن جوجل جداول البيانات والنواتج سلمان بدون علامات الاقتباس حول الكائن المفاتيح.حاولت القراءة في JSON دون ونقلت يعمل.كنت أتساءل ما هي أفضل طريقة للحصول على SimpleJSON الإخراج إلى أن تقرأ في جوجل تأريخها باستخدام

query = new google.visualization.Query("http://www.myuri.com/api/").

يمكنني استخدام التعابير المنطقية إلى إزالة علامات الاقتباس ، ولكن يبدو أن قذرة.جافا سكريبت سلمان تحليل المكتبات حاولت لن تقرأ في JSON جملة بدون علامات الاقتباس حول الكائن المفاتيح.

هنا بعض خلفية جيدة القراءة re:ونقلت حول الكائن المفاتيح:

http://simonwillison.net/2006/Oct/11/json/.

هل كانت مفيدة؟

المحلول

هل أنت متأكد من جوجل API يتوقع JSON ؟ في تجربتي جوجل واجهات برمجة التطبيقات لا تميل إلى أن تكون على نطاق واسع كسر بطريقة أنت تصف -- أنها يمكن أن تكون في الواقع أتوقع شكل مختلف هذا مجرد يشبه سلمان.


المزيد من بدس حول يكشف تعليمات لاسترجاع البيانات في شكل جوجل تتوقع:

على سبيل المثال ، الحصول على dataSourceUrl من جوجل جداول البيانات ، لا التالية:

  1. في جدول البيانات الخاص بك ، حدد نطاق من الخلايا.
  2. اختر إدراج " ثم "أداة' من القائمة.
  3. فتح القائمة الأداة عن طريق النقر على أعلى اليمين محدد.
  4. حدد خيار القائمة 'الحصول على البيانات المصدر URL'.

أنا فعلت هذا و فتحت عنوان URL في المتصفح الخاص بي.البيانات كانت في طريق العودة لم يكن بالتأكيد سلمان:

google.visualization.Query.setResponse(
{requestId:'0',status:'ok',signature:'1464883469881501252',
table:{cols: [{id:'A',label:'',type:'t',pattern:''},
{id:'B',label:'',type:'t',pattern:''}],
rows: [[{v:'a'},{v:'h'}],[{v:'b'},{v:'i'}],[{v:'c'},{v:'j'}],[{v:'d'},{v:'k'}],[{v:'e'},{v:'l'}],[{v:'f'},{v:'m'}],[{v:'g'},{v:'n'}]]}});

يبدو أن النتيجة المزمع تنفيذها مباشرة من خلال المتصفح.محاولة تعديل التعليمات البرمجية الخاصة بك أن تفعل شيئا مثل هذا:

# old
return simplejson.dumps ({"requestId": 1, "status": "ok", ...})

# new
json = simplejson.dumps ({"requestId": 1, "status": "ok", ...})
return "google.visualization.Query.setResponse(%r);" % json

نصائح أخرى

غير صالح "التسمية" الخطأ عادة بسبب أعمى eval() على سلسلة JSON ، مما أدى إلى أسماء الملكية كونه مخطئا كما تسميات (لأن لديهم نفس الجملة -- "فو:").

eval("{ foo: 42, bar: 43 }"); // Results in invalid label

العلاج السريع هو للتأكد من سلسلة JSON وقد قوسين أرفق الأقواس المعقوفة:

eval("({ foo: 42, bar: 43 })"); // Works

محاولة أرفق بك سلسلة JSON بين قوسين لمعرفة ما إذا كان غير صالح "التسمية" خطأ يذهب بعيدا.

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

تحليل كائن جافا سكريبت مثل سلمان في بايثون:

الحل:

>>> from re import sub
>>> import json
>>> js = "{ a: 'a' }"
>>> json.loads(sub("'", '"', sub('\s(\w+):', r' "\1":', js)))
{u'a': u'a'}

تحرير: (حافة الحالات المستعرضة)

لذلك كان ترعرعت أن الحل المقترح من شأنه أن عدم التعامل مع جميع الحالات وتحديدا مع شيء من هذا القبيل

على سبيل المثال{فو:"الحكم:هنا!"} سوف تحصل على تغيير {"فو":""الجملة":هنا!"}
– جيسون S Apr 12 في 18:03

لحل هذا نحن ببساطة بحاجة إلى التأكد من أننا في الواقع العامل مع مفتاح وليس مجرد نقطتين في سلسلة لذلك نحن لا نظرة وراء السحر التلميح فاصلة(,) أو متعرج({) وجود ضمان لدينا المناسبة مثل:

القولون في سلسلة:

>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub("'", '"', sub('(?<={|,)\s*(\w+):', r' "\1":', js)))
{u'foo': u'a sentence: right here!'}

والتي بالطبع هو نفسه كما تفعل:

>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub('(?<={|,)\s*(\w+):', r' "\1":', js).replace("'",'"'))
{u'foo': u'a sentence: right here!'} 

ولكن بعد ذلك أشار إلى أن هذا ليس العيب الوحيد لأن ما حول الاقتباس:

إذا نحن أيضا قلقون هرب ونقلت سوف يكون قليلا أكثر تحديدا ما يشكل سلسلة.الاقتباس الأول سوف تتبع إما متعرج({) مساحة(\s) أو علامة النقطتين (:) ، في حين آخر مطابقة اقتباس سوف تأتي قبل إما فاصلة(,) أو إغلاق متعرج(}) ثم يمكننا النظر في كل شيء في بين كجزء من نفس السلسلة, مثل ذلك:

تصريحات إضافية في سلسلة:

>>> js = "{foo: 'a sentence: it\'s right here!'}"
>>> json.loads(
...     sub("(?<=\s|{|:)'(.*?)'(?=,|})", 
...         r'"\1"', 
...         sub('(?<={|,)\s*(\w+):', r' "\1":', js))
...     )
{u'foo': u"a sentence: it's right here!"}

مشاهدة هذا الفضاء أكثر الحالات حافة يتم كشف حلها.يمكنك بقعة أخرى ؟

أو عن شيء أكثر تعقيدا وربما العالم الحقيقي سبيل المثال كما عاد من قبل npm view:

من:

{ name: 'chuck',
      description: 'Chuck Norris joke dispenser.',
      'dist-tags': { latest: '0.0.3' },
      versions: '0.0.3',
      maintainers: 'qard ',
      time: { '0.0.3': '2011-08-19T22:00:54.744Z' },
      author: 'Stephen Belanger ',
      repository: 
           { type: 'git',
             url: 'git://github.com/qard/chuck.git' },
          version: '0.0.3',
          dependencies: { 'coffee-script': '>= 1.1.1' },
          keywords: 
               [ 'chuck',
                 'norris',
                 'jokes',
                 'funny',
                 'fun' ],
              bin: { chuck: './bin/chuck' },
              main: 'index',
              engines: { node: '>= 0.4.1 < 0.5.0' },
              devDependencies: {},
              dist: 
                   { shasum: '3af700056794400218f99b7da1170a4343f355ec',
                     tarball: 'http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz' },
                  scripts: {},
                  directories: {},
                  optionalDependencies: {} }

إلى:

{u'author': u'Stephen Belanger ',
     u'bin': {u'chuck': u'./bin/chuck'},
     u'dependencies': {u'coffee-script': u'>= 1.1.1'},
     u'description': u'Chuck Norris joke dispenser.',
     u'devDependencies': {},
     u'directories': {},
     u'dist': {u'shasum': u'3af700056794400218f99b7da1170a4343f355ec',
      u'tarball': u'http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz'},
     u'dist-tags': {u'latest': u'0.0.3'},
     u'engines': {u'node': u'>= 0.4.1 < 0.5.0'},
     u'keywords': [u'chuck', u'norris', u'jokes', u'funny', u'fun'],
     u'main': u'index',
     u'maintainers': u'qard ',
     u'name': u'chuck',
     u'optionalDependencies': {},
     u'repository': {u'type': u'git', u'url': u'git://github.com/qard/chuck.git'},
     u'scripts': {},
     u'time': {u'0.0.3': u'2011-08-19T22:00:54.744Z'},
     u'version': u'0.0.3',
     u'versions': u'0.0.3'}

يعمل بالنسبة لي =)

منتديات الشاعر تركي الميزاني!

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