ฉันกำลังคัดวัตถุอย่างหนึ่ง {'foo': 'bar'}
ฉันจะเปลี่ยนสตริงกลับไปเป็นวัตถุได้อย่างไร
ฉันกำลังคัดวัตถุอย่างหนึ่ง {'foo': 'bar'}
ฉันจะเปลี่ยนสตริงกลับไปเป็นวัตถุได้อย่างไร
คำตอบ:
คุณต้องการJSON.parse()
สตริง
var str = '{"hello":"world"}';
try {
var obj = JSON.parse(str); // this is how you parse a string into JSON
document.body.innerHTML += obj.hello;
} catch (ex) {
console.error(ex);
}
JSON.parse
JSON.stringify
อยู่ฝั่งตรงข้ามของ
JSON.stringify
และJSON.parse
เกือบจะเป็น oposites และ "ปกติ" สิ่งนี้จะทำงาน:
var obj = ...;
var json = JSON.stringify(obj);
var obj2 = JSON.parse(json);
ดังนั้น obj และ obj2 จึง "เหมือนกัน"
อย่างไรก็ตามมีข้อ จำกัด บางประการที่ต้องระวัง บ่อยครั้งที่ปัญหาเหล่านี้ไม่สำคัญว่าคุณกำลังจัดการกับวัตถุอย่างง่าย แต่ฉันจะอธิบายบางส่วนของพวกเขาที่นี่โดยใช้ฟังก์ชันตัวช่วยนี้:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
คุณจะได้รับownProperties
วัตถุและสูญเสียต้นแบบ:
var MyClass = function() { this.foo="foo"; }
MyClass.prototype = { bar:"bar" }
var o = new MyClass();
var oo = jsonrepack(o);
console.log(oo.bar); // undefined
console.log( oo instanceof MyClass ); // false
คุณจะสูญเสียตัวตน:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // false
ฟังก์ชั่นไม่รอด:
jsonrepack( { f:function(){} } ); // Returns {}
วัตถุวันที่สิ้นสุดเป็นสตริง:
jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
ค่าที่ไม่ได้กำหนดอย่าอยู่รอด:
var v = { x:undefined }
console.log("x" in v); // true
console.log("x" in jsonrepack(v)); // false
วัตถุที่มีtoJSON
ฟังก์ชั่นอาจทำงานไม่ถูกต้อง
x = { f:"foo", toJSON:function(){ return "EGAD"; } }
jsonrepack(x) // Returns 'EGAD'
ฉันแน่ใจว่ามีปัญหากับประเภทอื่น ๆ ในตัวด้วย (ทั้งหมดนี้ผ่านการทดสอบโดยใช้ node.js ดังนั้นคุณอาจได้รับพฤติกรรมที่แตกต่างกันเล็กน้อยขึ้นอยู่กับสภาพแวดล้อมของคุณด้วย)
เมื่อมันไม่สำคัญว่ามันบางครั้งสามารถเอาชนะโดยใช้พารามิเตอร์เพิ่มเติมและJSON.parse
JSON.stringify
ตัวอย่างเช่น:
function MyClass (v) {
this.date = new Date(v.year,1,1);
this.name = "an object";
};
MyClass.prototype.dance = function() {console.log("I'm dancing"); }
var o = new MyClass({year:2010});
var s = JSON.stringify(o);
// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
if(k==="") {
var rv = new MyClass(1990,0,0);
rv.date = v.date;
rv.name = v.name;
return rv
} else if(k==="date") {
return new Date( Date.parse(v) );
} else { return v; } } );
console.log(o); // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance(); // I'm dancing
console.log(o2); // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]
o2.dance(); // I'm dancing
JSON SPEC
{ bar:"bar" }
(จากต้นแบบของคุณ) ไม่ถือว่า json ที่ถูกต้องเนื่องจากfoo
เป็นตัวแปรแทนที่จะเป็นสตริง JSON ที่ถูกต้องความต้องการที่จะเป็นkey
string
JSON.parse
บอกว่าใช้เพียง ฉันแค่เตือนว่ามีหลายกรณีที่จะจัดการไม่ถูกต้อง หากคุณกำลังใช้ข้อมูลดั้งเดิมที่บริสุทธิ์ (ไม่มีคลาส, ต้นแบบ) และเฉพาะประเภทข้อมูลที่สนับสนุนโดย JSON (ไม่มีวันที่, XML, HTML เป็นต้น) คุณก็โอเค
X = { foo:"bar" }
นั้นเหมือนกันกับX = { "foo":"bar" }
ที่X = {}; X.foo = "bar"
เหมือนกันกับX={}; X["foo"] = "bar"
วัตถุที่เป็นผลลัพธ์นั้นเหมือนกันในทั้ง 4 กรณี สิ่งนี้ไม่สร้างความแตกต่างให้กับความถูกต้องของ JSON ที่สร้างขึ้น
http://jsbin.com/tidob/1/edit?js,console,output
อ็อบเจ็กต์ JSON ดั้งเดิมมีวิธีการสำคัญสองวิธี
1. JSON.parse()
2. JSON.stringify()
JSON.parse()
วิธีการแยกวิเคราะห์สตริง JSON - คือการฟื้นฟูวัตถุ JavaScript เดิม
var jsObject = JSON.parse(jsonString);
JSON.stringify () วิธีการรับวัตถุ JavaScript และส่งคืนเทียบเท่า JSON ของมัน
var jsonString = JSON.stringify(jsObject);
แนะนำให้ใช้ JSON.parse
มีทางเลือกอื่นที่คุณสามารถทำได้:
var myObject = eval('(' + myJSONtext + ')');
เกี่ยวกับเรื่องนี้
var parsed = new Function('return ' + stringifiedJSON )();
eval
นี้เป็นทางเลือกที่ปลอดภัยสำหรับ
ลองดู.
http://jsfiddle.net/LD55x/
รหัส:
var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);
$("#save").click(function () {
debugger
var xx = [];
var dd = { "firstname": "", "lastname": "", "address": "" };
var otable1 = $("#table1").dataTable().fnGetData();
for (var i = 0; i < otable1.length; i++) {
dd.firstname = otable1[i][0];
dd.lastname = otable1[i][1];
dd.address = otable1[i][2];
xx.push(dd);
var dd = { "firstname": "", "lastname": "", "address": "" };
}
JSON.stringify(alert(xx));
$.ajax({
url: '../Home/save',
type: 'POST',
data: JSON.stringify({ u: xx }),
contentType: 'application/json;',
dataType: 'json',
success: function (event) {
alert(event);
$("#table2").dataTable().fnDraw();
location.reload();
}
});
});
{foo: 'bar'}
JSON นั้นไม่ถูกต้อง (ในขณะที่มันเป็นนิพจน์จาวาสคริปต์ที่ถูกต้อง)