سؤال

اقتباس مزدوج حتى لو كان هربا هو رمي خطأ التحليل.
إلقاء نظرة على الرمز أدناه

//parse the json in javascript  
var testJson = '{"result": ["lunch", "\"Show\""] }';  
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

هذا هو رمي خطأ تحليل بسبب الاقتباسات المزدوجة (التي تم هربها بالفعل).
حتى في eval() لن تعمل هنا.
ولكن إذا هربته مع مائلة مزدوجة مثل هذا:

var result = '{"result": ["lunch", "\\"Show\\""] }';  
var tags = JSON.parse(result);  
alert (tags.result[1]);

ثم يعمل بشكل جيد.
لماذا نحتاج إلى استخدام مائل مزدوج هنا في جافا سكريبت؟ المشكلة هي أن php json_encode() تعمل الدالة من اقتباس مزدوج مع مائل واحد (مثل هذا: \"show\") أي JSON.parse لن تكون قادرة على تحليل. كيف يمكنني التعامل مع هذا الموقف؟

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

المحلول

حسنا، وأخيرا، تستخدم تحليل JSON نفس التقييم، لذلك لا يوجد فرق عند منحهم SMTH. مع بناء جملة غير صحيح. في هذه الحالة، يجب عليك الهروب من علامات الاقتباس الخاصة بك بشكل صحيح في PHP، ثم يزفف منهم وخفض خططهم من JSON_ENCODE

<?php
    $json = '{"result": ["lunch", "\"Show\""] }';
    echo json_encode($json);
?>

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"

هذا يجب أن يعمل على JS من جانب العميل (إذا لم أجد أي خطأ مطبعي).

نصائح أخرى

JavaScript الهراء سلاسلها و JSON Unescapes لهم أيضا. السلسلة الأولى ( '{"result": ["lunch", "\"Show\""] }' ) ينظر إليها من قبل محلل json كما{"result": ["lunch", ""Show""] }, ، لأن \" في جافا سكريبت يعني ", ، ولكن لا يخرج سلسلة مزدوجة مقتبسة.

السلسلة الثانية '{"result": ["lunch", "\\\"Show\\\""] }' يحصل دون إزعاج {"result": ["lunch", "\"Show\""] } (وهذا غير صحيح من قبل JSON).

اعتقد انه '{"result": ["lunch", "\\"Show\\""] }' يجب أن تعمل أيضا.

سبب هذه المشكلة ناتجة عن آلية الهروب من سلسلة مطوية: يأتي واحد من JS وواحد يأتي من JSON.

يتم استخدام مزيج من شخصية الخلفية المشتركة مع حرف آخر بعد آخر لتمثيل حرف واحد هذا ليس تمثيلا خلاف ذلك داخل السلسلة. "" تقف ل " 'الخ

هذه الآلية الهاربة تحدث قبل json.parse () يعمل.

علي سبيل المثال،

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"

من وجهة نظر مولد السلسلة، يمر أربعة خلفية خلفية "" في فوري جافا سكريبت.

من وجهة نظر الجافا سكريبت هناك اثنين من الرائدة() سيتم تفسير تسلسل كل "" ك "".

من وجهة نظر جون المحلل، يتلقى اثنين من رد الفعل() وسيقوم قواعد JSON سلسلة الهروب بضرورة كواحد واحد "" وهو نتيجة الإخراج.

اشرح لك الرمز الأول:

var testJson = '{"result": ["lunch", "\"Show\""] }';
//The real string after sequence escaping in to JS is
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse.
//Thus, it breaks the JSON grammar and generates an error
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

من مستندات

JSON_HEX_APOS (عدد صحيح) جميع 'يتم تحويلها إلى u0027
JSON_HEX_QUOT (عدد صحيح) جميع "يتم تحويلها إلى u0022

يستغرق JSON_Encode () اثنين من Args والقيمة والخيارات. لذا حاول

json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);

لم أحاول ذلك.

اطفئه magic_quotes_gpc في php.ini..

PHP إلى كائن JavaScript (PHP> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');

إذا تم إضافة Escapes C القياسية، إذن JSON.parse سوف تحويل التسلسل مثل \" إلى ", \\ إلى \, \n في خط الأعلاف، إلخ.

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

في حالة مشروعنا:

سلسلة الأصلية ""{\"lat\":28.4594965,\"lng\":77.0266383}""

بعد المرور إلى JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

على 2اختصار الثاني انقل الى JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

لاحظ أن JSON.parse() إزالة الحروف الهاجبة بدلا من التحويل string ل object.

بعد إزالة الأحرف الهروب، عملت السلسلة لتحويل الكائنات.

هنا هو العرض التوضيحي:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

هذا قد يساعد:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top