سؤال

عند إنشاء كائن أو مصفوفة JSON يدويًا، غالبًا ما يكون من الأسهل ترك فاصلة زائدة على العنصر الأخير في الكائن أو المصفوفة.على سبيل المثال، قد تبدو التعليمات البرمجية المراد إخراجها من مصفوفة من السلاسل (في لغة C++ مثل الكود الكاذب):

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

مما يتيح لك سلسلة مثل

[0,1,2,3,4,5,]

هل هذا مسموح؟

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

المحلول

مواصفات JSON لا يسمح فاصلة زائدة. هناك عدد قليل من المتصفحات التي من شأنها أن تسمح بذلك، ولكن عموما تحتاج للقلق حول جميع المتصفحات.

في عام أحاول تحويل مشكلة حولها، وإضافة الفاصلة قبل القيمة الفعلية، حتى ينتهي بك الأمر مع رمز يشبه هذا:

s.append("[");
for (i = 0; i < 5; ++i) {
  if (i) s.append(","); // add the comma only if this isn't the first entry
  s.appendF("\"%d\"", i);
}
s.append("]");

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

وثمة بديل آخر لقد استعملت عند إخراج الهيكل لJSON من قاموس بعض النموذج لإلحاق دائما فاصلة بعد كل إدخال (كما تقومون به أعلاه) ثم قم بإضافة إدخال وهمية في نهاية لم زائدة فاصلة (ولكن هذا هو مجرد كسول، ->).

لا تعمل بشكل جيد مع مجموعة أسف.

نصائح أخرى

ولا. المواصفات JSON، كما حافظت على http://json.org ، لا يسمح زائدة بفواصل. من ما رأيت، بعض موزعي قد تسمح لهم بصمت عند قراءة سلسلة JSON، في حين أن آخرين سوف رمي الأخطاء. للتشغيل المتبادل، يجب أن لا يتضمن ذلك.

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

وبسيطة ورخيصة وسهلة القراءة، وتعمل دائما بغض النظر عن المواصفات.

$delimiter = '';
for ....  {
    print $delimiter.$whatever
    $delimiter = ',';
}

والتنازل زائدة عن الحاجة إلى $ delim هو ثمن صغير جدا على الدفع. كما تعمل فقط كذلك إذا لم يكن هناك حلقة صريحة ولكن أجزاء التعليمات البرمجية منفصلة.

يسمح

وزائدة الفواصل في جافا سكريبت، ولكن لا تعمل في IE. لم المواصفات versionless JSON دوغلاس كروكفورد لن يسمح لهم، ولأنه كان versionless هذا لم يكن من المفترض أن يتغير. سمحت المواصفات ES5 JSON لهم امتدادا، ولكن كروكفورد في RFC 4627 لم يكن، وعادت ES5 لتنكر لهم. فايرفوكس حذت حذوها. إنترنت إكسبلورر هو السبب في أننا لا يمكن أن يكون أشياء جميلة.

وكما قيل بالفعل، JSON المواصفات (على أساس ECMAScript 3) لا يسمح زائدة فاصلة. ES> = 5 يسمح لها، لذلك يمكنك فعلا استخدام تلك الرموز في JS نقية. لقد قيل عنه، وبعض موزعي لم دعمه ( HTTP: // bolinfest. كوم / مقالات / json.html و <لأ href = "http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/" يختلط = "noreferrer"> http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/ )، لكنه حقيقة المواصفات (كما هو موضح في < وأ href = "http://json.org/" يختلط = "noreferrer"> http://json.org/ ) أنه لا ينبغي أن العمل في JSON. وقال هذا الشيء ...

... أنا أتساءل لماذا لا أحد أشار إلى أن يمكنك تقسيم في الواقع حلقة في التكرار 0TH واستخدام <م> الرائدة فاصلة بدلا من زائدة واحدة للتخلص من رائحة كود المقارنة و أي النفقات العامة الأداء الفعلي في الحلقة، مما أدى إلى رمز هذا أقصر في الواقع، وأبسط وأسرع (بسبب عدم التفرع / الشرطية في حلقة) من الحلول الأخرى المقترحة.

ومنها مثلا. (في شبة الكود على غرار C مماثل إلى رمز المقترحة OP و):

s.append("[");
// MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
    s.appendF("\"%d\"", 0); // 0-th iteration
    for( int i = 1; i < MAX; ++i ) {
        s.appendF(",\"%d\"", i); // i-th iteration
    }
}
s.append("]");

قد يرغب مبرمجو PHP في التحقق من ذلك ينفجر داخليا، ينهار للداخل().يأخذ هذا مصفوفة تنضم إليها باستخدام سلسلة.

من مستندات...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone

ومن المثير للاهتمام، على حد سواء C & C ++ (وأعتقد C #، لكنني لست متأكدا) تسمح على وجه التحديد الفاصلة زائدة - بالضبط سبب معين: إنه جعل القوائم توليد programmaticly أسهل بكثير. لا يدري لماذا جافا سكريبت لم يتبع تقدمه.

استخدم JSON5.لا تستخدم JSON.

  • يمكن أن تحتوي الكائنات والمصفوفات على فواصل زائدة
  • يمكن أن تكون مفاتيح الكائنات غير مقتبسة إذا كانت معرفات صالحة
  • يمكن أن تكون السلاسل ذات علامات اقتباس مفردة
  • يمكن تقسيم السلاسل عبر أسطر متعددة
  • يمكن أن تكون الأرقام ست عشرية (الأساس 16)
  • يمكن أن تبدأ الأرقام أو تنتهي بنقطة عشرية (بادئة أو لاحقة).
  • يمكن أن تتضمن الأرقام Infinity و-Infinity.
  • يمكن أن تبدأ الأرقام بعلامة زائد (+) صريحة.
  • يُسمح بالتعليقات المضمنة (سطر واحد) والتعليقات المجمعة (متعددة الأسطر).

http://json5.org/

https://github.com/aseemk/json5

بحسب ال مواصفات فئة JSONArray:

  • قد تظهر فاصلة إضافية قبل قوس الإغلاق مباشرةً.
  • سيتم إدراج القيمة الخالية عند وجود حذف (فاصلة).

لذا، كما أفهمها، ينبغي السماح له بالكتابة:

[0,1,2,3,4,5,]

ولكن قد يحدث أن يقوم بعض المحللين بإرجاع الرقم 7 كعدد عناصر (مثل IE8 كما أشار دانييل إيرويكر) بدلاً من الرقم 6 المتوقع.


تم التعديل:

لقد وجدت هذا مدقق JSON الذي يتحقق من صحة سلسلة JSON مقابل آر إف سي 4627 (نوع وسائط التطبيق/json لتدوين كائن JavaScript) وضد مواصفات لغة JavaScript.في الواقع، تعتبر المصفوفة التي تحتوي على فاصلة زائدة صالحة لجافا سكريبت فقط وليس لمواصفات RFC 4627.

ومع ذلك، في مواصفات RFC 4627 ينص على ما يلي:

2.3.المصفوفات

يتم تمثيل هيكل المصفوفة كقوسات مربعة تحيط صفر أو أكثر من القيم (أو العناصر).يتم فصل العناصر بفواصل.

array = begin-array [ value *( value-separator value ) ] end-array

بالنسبة لي، هذه مرة أخرى مشكلة تفسير.إذا كتبت ذلك يتم فصل العناصر بفواصل (دون ذكر أي شيء عن حالات خاصة، مثل العنصر الأخير)، يمكن فهمه في كلا الاتجاهين.

ملاحظة.RFC 4627 ليس معيارًا (كما هو مذكور صراحةً)، وقد تم إلغاؤه بالفعل بواسطة RFC 7159 (وهو معيار مقترح) آر إف سي 7159

ومن تجربتي الماضية، وجدت أن متصفحات مختلفة تتعامل مع زائدة الفواصل في JSON بشكل مختلف.

وكل من فايرفوكس وكروم مقابض أنه على ما يرام. ولكن IE (جميع الإصدارات) ويبدو أن كسر. أعني حقا كسر ووقف قراءة بقية النص.

وحفظ ذلك في الاعتبار، وكذلك حقيقة أنه من الجيد دائما لكتابة التعليمات البرمجية متوافق، أقترح أن أمضى مزيدا من الجهد للتأكد من أن ليس هناك فاصلة زائدة.

و:)

وأظل العدد الحالي ومقارنتها إلى العدد الإجمالي. إذا كان العدد الحالي أقل من العدد الإجمالي، وعرض فاصلة.

قد لا يعمل إذا لم يكن لديك العدد الإجمالي قبل تنفيذ الجيل JSON.

وبعد ذلك مرة أخرى، إذا كان لديك باستخدام PHP 5.2.0 أو أفضل، يمكنك فقط تنسيق استجابة باستخدام API JSON بنيت فيها

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

لا يوجد أي سبب على الإطلاق لوجود الفواصل لتحليل مستند يشبه JSON.

ألقِ نظرة على مواصفات Relaxed JSON وسترى مدى "ضجيج" مواصفات JSON الأصلية.هناك الكثير من الفواصل والاقتباسات ...

http://www.relaxedjson.org

يمكنك أيضًا تجربة المثال الخاص بك باستخدام محلل RJSON عبر الإنترنت ورؤيته يتم تحليله بشكل صحيح.

http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D

وأنا عادة حلقة على مجموعة وإرفاق فاصلة بعد كل دخول في السلسلة. بعد حلقة I حذف الفاصلة مشاركة مرة أخرى.

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

لا ينصح، ولكن لا يزال بإمكانك أن تفعل شيئا مثل هذا لتحليل ذلك.

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)

وهناك وسيلة ممكنة لتجنب إذا الفروع في الحلقة.

s.append("[ "); // there is a space after the left bracket
for (i = 0; i < 5; ++i) {
  s.appendF("\"%d\",", i); // always add comma
}
s.back() = ']'; // modify last comma (or the space) to right bracket

وبما أن يستخدم لحلقة لتكرار عبر صفيف، أو بنية بيانات iterable مماثل، يمكننا استخدام طول المصفوفة كما هو مبين،

awk -v header="FirstName,LastName,DOB" '
  BEGIN {
    FS = ",";
    print("[");
    columns = split(header, column_names, ",");
  }
  { print("  {");
    for (i = 1; i < columns; i++) {
      printf("    \"%s\":\"%s\",\n", column_names[i], $(i));
    }
    printf("    \"%s\":\"%s\"\n", column_names[i], $(i));
    print("  }");
  }
  END { print("]"); } ' datafile.txt

ومع datafile.txt تحتوي على،

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top