سؤال

بالنظر إلى سلسلة من بيانات JSON، كيف يمكنك تحويل هذه السلسلة بأمان إلى كائن JavaScript؟

من الواضح أنه يمكنك القيام بذلك بشكل غير آمن باستخدام شيء مثل ...

var obj = eval("(" + json + ')');

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

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

المحلول

JSON.parse(jsonString) هو أسلوب جافا سكريبت خالص طالما يمكنك ضمان متصفح حديث إلى حد معقول.

نصائح أخرى

تم الآن إهمال طريقة jQuery.استخدم هذه الطريقة بدلاً من ذلك:

let jsonObject = JSON.parse(jsonString);

الإجابة الأصلية باستخدام وظيفة jQuery المهملة:

إذا كنت تستخدم jQuery فقط استخدم:

jQuery.parseJSON( jsonString );

هذا هو بالضبط ما تبحث عنه (راجع ملف jQuery توثيق).

يحرر:هذه الإجابة مخصصة لـ IE < 7، وبالنسبة للمتصفحات الحديثة، تحقق من إجابة جوناثان أعلاه.

يحرر:هذه الإجابة قديمة و إجابة جوناثان أعلاه (JSON.parse(jsonString)) هو الآن افضل جواب.

JSON.org يحتوي على موزعي JSON للعديد من اللغات بما في ذلك 4 لغات مختلفة لجافا سكريبت.أعتقد أن معظم الناس سوف يفكرون json2.js تنفيذ goto الخاصة بهم.

استخدم رمزًا بسيطًا ممثلاً في ما يلي الرابط على MSDN.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

والعكس

var str = JSON.stringify(arr);

لست متأكدًا من الطرق الأخرى للقيام بذلك ولكن إليك كيفية القيام بذلك النموذج الأولي (برنامج JSON التعليمي).

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

الاتصال إيفالJSON() مع صحيح حيث تقوم الوسيطة بتعقيم السلسلة الواردة.

يبدو أن هذه هي المشكلة:

يتم تلقي الإدخال عبر ajax websocket وما إلى ذلك، وسيكون دائمًا بتنسيق String - ولكن عليك معرفة ما إذا كان JSON.parsable.المشكلة هي أنه إذا قمت دائمًا بتشغيله من خلال JSON.parse، فقد يستمر البرنامج "بنجاح" ولكنك ستظل ترى خطأً تم طرحه في وحدة التحكم مع "خطأ:" المخيف:رمز غير متوقع "x"".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

إذا كنت تستخدم مسج, ، يمكنك أيضًا القيام بذلك $.getJSON(url, function(data) { });

ثم يمكنك أن تفعل أشياء مثل data.key1.something, data.key1.something_else, ، إلخ.

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

يتم تمرير البيانات التي تم إرجاعها إلى رد الاتصال، والتي ستكون عبارة عن كائن أو مصفوفة JavaScript كما هو محدد بواسطة بنية JSON ويتم تحليلها باستخدام $.parseJSON() طريقة.

للمتعة فقط، إليك طريقة استخدام الوظيفة:

 jsonObject = (new Function('return ' + jsonFormatData))()

حاول استخدام الطريقة مع كائن البيانات هذا.السابق:Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

تساعد هذه الطريقة حقًا في Nodejs عند العمل مع برمجة المنفذ التسلسلي

ربما يكون استخدام JSON.parse هو أفضل طريقة.هنا مثال عرض حي

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

أسهل طريقة باستخدام parse() طريقة:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

ثم يمكنك الحصول على قيم Json العناصر، على سبيل المثال:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

استخدام مسج كما هو موضح في توثيق:

JSON.parse(jsonString);

لقد وجدت طريقة "أفضل":

في كوفي سكريبت:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

في جافا سكريبت:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});
JSON.parse(jsonString);

سوف يتغير json.parse إلى كائن.

تحليل JSON هو دائمًا ألم في المؤخرة.إذا لم يكن الإدخال كما هو متوقع، فسيؤدي ذلك إلى حدوث خطأ ويعطل ما تفعله.يمكنك استخدام الوظيفة الصغيرة التالية لتحليل مدخلاتك بأمان.يقوم دائمًا بتحويل الكائن حتى لو كان الإدخال غير صالح أو كان بالفعل كائنًا وهو الأفضل في معظم الحالات.

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

إن تحويل الكائن إلى JSON ثم تحليله يناسبني، مثل:

JSON.parse(JSON.stringify(object))

إذا كان لدينا سلسلة مثل هذا:"{" status ": 1 ، " token ": " 65B4352B2DFC4957A09ADD0CE5714059 "}" ثم يمكننا ببساطة استخدام json.parse مرتين لتحويل هذه السلسلة إلى كائن JSON:

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

وببساطة يمكننا استخراج القيم من كائن JSON باستخدام:

    // instead of last JSON.parse:
    var { status, token } = JSON.parse(jsonString);

ستكون النتيجة:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

يقوم JSON.parse() بتحويل أي سلسلة JSON تم تمريرها إلى الوظيفة إلى كائن JSON.

لفهم أفضل، اضغط على F12 لفتح Inspect Element في متصفحك وانتقل إلى وحدة التحكم لكتابة الأوامر التالية:-

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

الآن قم بتشغيل الأمر :-

console.log(JSON.parse(response));

ستحصل على الإخراج ككائن {result:صحيح، عد:1}.

من أجل استخدام هذا الكائن، يمكنك تعيينه للمتغير دعنا نقول obj: -

var obj = JSON.parse(response);

الآن باستخدام عامل التشغيل obj وdot(.) يمكنك الوصول إلى خصائص كائن JSON.

حاول تشغيل الأمر

console.log(obj.result);

موثقة رسميا:

ال JSON.parse() تقوم الطريقة بتحليل سلسلة JSON، وإنشاء قيمة JavaScript أو الكائن الموصوف بواسطة السلسلة.اختياري reviver يمكن توفير الوظيفة لإجراء تحويل على الكائن الناتج قبل إعادته.

بناء الجملة

JSON.parse(text[, reviver])

حدود

نص

السلسلة المراد تحليلها كـ JSON.راجع كائن JSON للحصول على وصف لبناء جملة JSON.

منعش (اختياري)

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

قيمة الإرجاع

الكائن المطابق لنص JSON المحدد.

الاستثناءات

يطرح استثناء SyntaxError إذا كانت السلسلة المراد تحليلها غير صالحة JSON.

يمكنك أيضا استخدام reviver وظيفة التصفية.

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

لمزيد من المعلومات قراءة JSON.parse

أعرف السؤال الأقدم، لكن لا أحد يلاحظ هذا الحل باستخدام new Function(), ، وظيفة مجهولة تقوم بإرجاع البيانات.


مجرد مثال:

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

يعد هذا أكثر أمانًا لأنه يتم تنفيذه داخل وظيفة ولا يتم تجميعه في التعليمات البرمجية الخاصة بك مباشرة.لذا، إذا كان هناك إعلان دالة بداخله، فلن يتم ربطه بكائن النافذة الافتراضي.

أستخدم هذا "لتجميع" إعدادات التكوين لعناصر DOM (على سبيل المثال سمة البيانات) بشكل بسيط وسريع.

قم بتحليل سلسلة json باستخدام JSON.parse()، وستصبح البيانات كائن JavaScript.

JSON.parse(jsonString)

هنا يمثل JSON معالجة مجموعة بيانات json.

على سبيل المثال ، تخيل أننا تلقينا هذا النص من خادم الويب:

'{ "name":"John", "age":30, "city":"New York"}'

للتحليل إلى كائن json:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

هنا obj هو كائن JSON ذي الصلة والذي يبدو كما يلي.

{ "name":"John", "age":30, "city":"New York"}

لجلب القيمة المستخدمة .مثال المشغل:

obj.name // John
obj.age //30

لنقل العكس، قم بتحويل كائن JavaScript إلى سلسلة باستخدام JSON.stringify().

ملخص:

تحتوي Javascript (كل من المتصفح وNodeJS) على خاصية مدمجة JSON هدف.يوجد في هذا الكائن طريقتان مناسبتان للتعامل معه JSON.وهم ما يلي:

  1. JSON.parse() يأخذ JSON كوسيطة، ترجع كائن JS
  2. JSON.stringify() يأخذ كائن JS كإرجاع وسيطة JSON هدف

تطبيقات أخرى:

بالإضافة إلى التعامل معه بشكل مريح للغاية JSON لديهم يمكن استخدامها لوسائل أخرى.مزيج من الاثنين معا JSON تتيح لنا الأساليب إجراء عمليات نسخ عميقة للمصفوفات أو الكائنات بسهولة شديدة.على سبيل المثال:

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged

إذا كان جافا سكريبت الخاص بك موجودًا موتولز ال JSON.parse سيكون مجهولاً بواسطة الإطار.
صالحة بناء الجملة يجب أن يكون تحويل سلسلة JSON بأمان إلى كائن:

var object = JSON.decode(string[, secure]);

علاوة على ذلك أ JSON Request يمكن رفع كائن قادر على التحليل مباشرة.
يمكنك التحقق من كيفية تحول أ بيانات json الأولية هنا:

http://jsfiddle.net/chetabahana/qbx9b5pm/

جرب هذا. هذا مكتوب بخط الآلة الكاتبة.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top