ทำไม Javascript ใช้ JSON.stringify แทน JSON.serialize


18

ฉันแค่สงสัยเกี่ยวกับ"stringify" VS "อันดับ" สำหรับผมพวกเขากำลังสิ่งเดียวกัน ( แต่ผมอาจจะผิด) แต่ในประสบการณ์ที่ผ่านมาของฉัน (ส่วนใหญ่กับ ) ผมใช้และไม่เคยใช้Serialize()Stringify()

ฉันรู้ว่าฉันสามารถสร้างนามแฝงง่ายๆใน Javascript

// either
JSON.serialize = function(input) {
    return JSON.stringify(input);
};

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

แต่ฉันแค่สงสัยเกี่ยวกับความแตกต่างระหว่างสองและทำไมเลือก stringify


เพื่อวัตถุประสงค์ในการเปรียบเทียบนี่คือวิธีที่คุณจัดลำดับ XML เป็นสตริงใน C #

public static string SerializeObject<T>(this T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    StringWriter textWriter = new StringWriter();

    xmlSerializer.Serialize(textWriter, toSerialize);
    return textWriter.ToString();
}

7
ที่จริงคุณทำJSON.serialize = JSON.stringifyไม่ได้เหรอ?
Daniel DiPaolo

ทำไมใช่คุณทำได้
Chase Florell

1
ผมคิดว่าหลังจากที่อีกครั้งอ่านคำถามของฉันฉันเห็นว่าใน # ตัวอย่างเช่น C ของฉันฉัน serializing XML ToString();และแล้วแปลงวัตถุเนื่อง มีถู inlies
Chase Florell

ฉันเดาว่าความต่อเนื่องมันจะดีกว่า (สำหรับฉัน) ที่จะมีวิธีการที่มีลักษณะเช่นนี้ ... JSON.serialize(obj).toString();หรือjsonObject().toString();... ด้วยวิธีนี้มันจะดูเหมือน C # ของฉัน แต่ตอนนี้ฉันกำลังยุ่งอยู่กับมันมากกว่า
Chase Florell

คำตอบ:


12

ลองดูความคิดเห็นสองข้อที่คุณตั้งคำถาม:

ฉันคิดว่าหลังจากอ่านคำถามของฉันอีกครั้งฉันเห็นว่าในตัวอย่าง C # ของฉันฉันเป็นอันดับ XML และจากนั้นการแปลงวัตถุเป็นอันดับ ToString (); มีถู inlies

และ

ฉันเดาว่าความต่อเนื่องมันจะดีกว่า (สำหรับฉัน) ที่จะมีวิธีการที่มีลักษณะเช่นนี้ ... JSON.serialize (obj) .toString (); หรือ jsonObject (). toString (); ... ด้วยวิธีนี้มันจะดูเหมือน C # ของฉัน แต่ตอนนี้ฉันกำลังยุ่งอยู่กับมันมากกว่า

ตอนนี้จำไว้ว่าใน Javascript วัตถุนั้นเป็นแฮช (แทนที่จะใช้ Prototype หรือเฟรมเวิร์กอื่นมันควรจะมีคุณสมบัติเป็น "แฮชชนิดพิเศษ" - แต่รูปแบบง่าย ๆ ใช้กับตัวอย่างนี้):

var obj = {
   foo: 1,
   bar: function() { console.log(this.foo); }
}
obj.foo; // 1
obj.bar; // function reference
obj.bar(); // function call
obj['foo']; // 1
obj['bar']; // function reference
obj['bar'](); // function call

เหตุผลเดียวที่serialize()อาจมีความจำเป็นใน Javascript คือการตัดการทำงานการอ้างอิงไปยังวัตถุอื่น ๆ เป็นต้น

ดังนั้นเพื่อกลับไปที่ตัวอย่าง C # ของคุณ - เราเพิ่งตัดออก.Serialize()โดยไม่จำเป็น วัตถุคือแฮชมันถูกทำให้เป็นอนุกรมแล้ว "การทำให้เป็นอนุกรม" จะต้องทำด้วยตนเองในรหัสของคุณเอง .ToString()ทุกสิ่งที่คุณเป็นใบ

ไม่.stringify()ทำให้รู้สึกมากขึ้นตอนนี้หรือไม่


ใช่ stringify สมเหตุสมผล แต่ฉันยังคงค่อนข้างใช้.toString()
Chase Florell

7
toString อาจหมายถึงอะไรก็ได้ JSON.stringify ชัดเจน JSON
Brandon

11

นี่เป็นเพราะสัญกรณ์JSONนั้นถูกระบุในปี 1999 ไม่ใช่หลังจากปี 2002 ( asp.netเผยแพร่ในปีนั้น) serializeดังนั้นผมคิดว่าพวกเขาไม่ได้รู้เกี่ยวกับ

ตลกกัน

การได้ยินคำserializationสิ่งแรกที่อยู่ในใจของฉันก็เหมือนกับการแปลงข้อมูลเป็นไบต์ที่นี่ JSON.stringify ทำให้รู้สึกที่สมบูรณ์แบบในขณะที่มันแปลงวัตถุเป็นสตริงแทนไม่ใช่การแทนไบต์

PS:

@Chase Florell คุณไม่สามารถเพิ่มJSON.serializeได้เนื่องจากในโหมดเข้มงวดรหัสนี้อาจล้มเหลวในบางเบราว์เซอร์

เป็นJSONไม่ได้เป็นวัตถุเฉลี่ยของคุณ


ฉันเดาจากประสบการณ์ของฉัน (จำกัด ) การทำให้บางสิ่งเป็นอันดับได้รับการแปลงเป็นสตริงในรูปแบบบางอย่างสำหรับการจัดเก็บไฟล์แบบแฟลต ฉันได้สิ่งที่คุณพูด
Chase Florell

ฉันคิดว่ามันเป็น 2001 .. ดูวิกิพีเดีย ชื่อนี้อาจเป็นความชอบส่วนตัวของ Douglas Crockford ปี 1999 เป็นปีที่มาตรฐาน ECMA ที่ 3 ออกมาซึ่งก่อตั้งขึ้นโดย JSON
Martijn Pieters

1
@ChaseFlorell การทำให้เป็นอนุกรมหมายถึงการเปลี่ยนวัตถุในหน่วยความจำให้เป็นรูปแบบข้อมูลที่ต่อเนื่องกันเป็นลำดับดังนั้นมันจึงอาจมีอยู่ในรูปแบบอะตอมฉันเชื่อว่าวิธีการทั่วไปมากขึ้นในการทำมันคือการเป็นตัวแทน bytewise สำหรับการส่งผ่านเครือข่าย
Jimmy Hoffa

@ avinashr, re: psของคุณ:แก้ไข ... ซอนี้ดูเหมือนจะไม่ล้มเหลว คุณสามารถอธิบายได้ว่า " JSONไม่ใช่วัตถุเฉลี่ยของคุณ" ได้อย่างไร ฉันไม่ได้เป็นคนพูดจาฉ้อโกงเพียงแค่ชัดเจนในสิ่งที่คุณหมายถึง
Chase Florell

2
@ChaseFlorell ถูกต้อง - เกี่ยวกับ Javascript, JSON เป็นส่วนหนึ่งของวัตถุ Javascript ที่ถูกต้อง ดูคำตอบของฉันสำหรับตัวอย่างง่ายๆ: JSON ที่ถูกต้องทั้งหมดเป็น Javascript object / hash ที่ถูกต้อง แต่ไม่ใช่ Javascript object / hash ทั้งหมดที่เป็น JSON ที่ถูกต้อง มันอยู่ในชื่อ - JSON ย่อมาจาก "JavaScript Object Notation"
Izkata
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.