ประเภทเนื้อหา JSON ที่ถูกต้องคืออะไร?


10250

ฉันเคยยุ่งกับJSON มาซักพักแล้วก็แค่ผลักมันออกมาเป็นข้อความและมันก็ไม่ได้ทำให้ใครบาดเจ็บ (ที่ฉันรู้) แต่ฉันก็อยากจะทำสิ่งต่าง ๆ ให้ถูกต้อง

ฉันได้เห็นดังนั้นหลายคนอ้างว่า "มาตรฐาน" สำหรับประเภทเนื้อหา JSON นี้:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

แต่อันไหนที่ถูกต้องหรือดีที่สุด? ฉันรวบรวมว่ามีปัญหาด้านความปลอดภัยและการสนับสนุนเบราว์เซอร์แตกต่างกันไป

ฉันรู้ว่ามีคำถามคล้ายกันประเภท MIME คืออะไรหาก JSON ถูกส่งคืนโดย REST API แต่ฉันต้องการคำตอบที่ตรงเป้าหมายกว่าเล็กน้อย

คำตอบ:


10307

สำหรับข้อความ JSON:

application/json

MIME ชนิดของสื่อสำหรับข้อความ JSON application/jsonคือ การเข้ารหัสเริ่มต้นคือ UTF-8 (ที่มา: RFC 4627 )

สำหรับJSONP (จาวาสคริปต์ที่รันได้ ) ที่มีการโทรกลับ:

application/javascript

นี่คือโพสต์บล็อกบางส่วนที่กล่าวถึงในความคิดเห็นที่เกี่ยวข้อง



ฉันสามารถส่งไฟล์พร้อมข้อความ Json ได้หรือไม่
OPV

7
บางครั้ง Internet Explorer มีปัญหากับ application / json - บล็อกออฟไลน์
kudlatiger

6
ลองนึกภาพฉันมีเอกสารที่เขียนโดยใครบางคนที่มีข้อความล้วน ตอนนี้ข้อความธรรมดาก็กลายเป็น JSON ที่ถูกต้องเช่นกัน ฉันจะผิดไหมถ้าใช้ text / plain เป็น mime-type? JSON เป็นข้อความย่อย ดังนั้นฉันคิดว่าทั้งคู่ควรได้รับอนุญาต คำถามคืออะไรที่ใช้งานได้ดีกว่าในการปฏิบัติ ตามความเห็นโดย codetoshare IE มีปัญหากับ application / json แต่เบราว์เซอร์ไม่ควรมีปัญหากับข้อความ / ธรรมดา หากข้อความ / ข้อความธรรมดาไม่ปลอดภัยฉันจะแสดงไฟล์ข้อความจากเว็บไซต์ของฉันได้อย่างไร
Panu Logic

5
@EugenMihailescu ชื่อของหน้านั้นคือ "รายการประเภท MIME ที่ไม่สมบูรณ์"
Omegastick

1616

IANAได้จดทะเบียนอย่างเป็นทางการสำหรับประเภท MIME JSON application/jsonเป็น

เมื่อถูกถามเกี่ยวกับสาเหตุที่ไม่ได้text/json, ครอกดูเหมือนว่าจะได้กล่าว JSON ไม่ได้จริงๆ JavaScript มิได้ข้อความและยัง IANA ก็มีแนวโน้มที่จะมือออกกว่าapplication/*text/*

แหล่งข้อมูลเพิ่มเติม:


166
มีหลายสิ่งที่ถูกนำมาใส่ในtext/*ส่วนของวันแรก ๆ ที่อาจจะใส่เข้าไปในapplication/*ส่วนของวันนี้
TRiG

29
@Rohmer - คุณ "สามารถ" เปิดอะไรก็ได้ในโปรแกรมแก้ไขข้อความ แต่รูปแบบไบนารี่เช่น JPEG หรือ Windows .exe หรือ. zip จะมีอักขระที่ไม่สามารถพิมพ์ได้ซึ่งสามารถทำลายโปรแกรมแก้ไขข้อความได้หลายอย่าง ลองใช้cat file.jpgตัวอย่าง โดยที่ไฟล์ xml หรือ json นั้นสามารถพิมพ์ได้ 100% ดังนั้นฉันคิดว่าจุดของ Stijn de Witt เป็นสิ่งที่ถูกต้องแม้ว่าข้อเท็จจริงที่ว่าใช่มันจะสายเกินไปที่จะเปลี่ยนแปลงในขณะนี้
XP84

4
@ XP84 คุณสามารถเปิดไบนารีใด ๆ ด้วยโปรแกรมแก้ไขข้อความในรูปแบบ HEX และตัวละครที่แตกต่างกัน (ทั้ง 16 ตัว) นั้นสามารถพิมพ์ได้ 100% ดังนั้นโดยตรรกะนั้น ... เป็นข้อความไบนารีทั้งหมดหรือไม่ Json ไม่ใช่ข้อความ Json คือ(คำเตือน: คำจำกัดความหลวมอย่างไม่เป็นทางการล่วงหน้า)การแสดงข้อความของวัตถุ (หรืออาร์เรย์ของวัตถุ)
xDaizu

5
ไม่มีความหมายต่อวลี "ตัวแก้ไขข้อความในรูปแบบ HEX" ตัวแก้ไข Hex แสดงแต่ละไบต์เป็นค่าเลขฐานสิบหกของมันตัวอย่างเช่นไบต์ 1111000 เป็น "78" แม้ว่าอาจมีโปรแกรมแก้ไขข้อความซึ่งมีโหมดแก้ไขเลขฐานสิบหกอยู่ด้วย แต่นี่ก็ไม่ได้เป็นเรื่องปกติและไม่เป็นประโยชน์สำหรับสิ่งใดนอกจากผู้ใช้ด้านเทคนิคส่วนใหญ่ที่ทำงานด้านเทคนิคมากที่สุด ข้อความโดยการเปรียบเทียบหมายถึง ASCII หรือ Unicode และในข้อความไบต์ 1111000 หมายถึงxอักขระตัวพิมพ์เล็ก ไม่ใช่ 78. JSON เป็นข้อความในลักษณะเดียวกับ HTML (text / html) มันมีเพียงตัวอักษรข้อความที่อ่านได้มีความหมายที่มีโครงสร้างในพวกเขา
XP84

11
ฉันมักจะเห็นด้วยกับ Stijn de Witt JSON มีวัตถุประสงค์เพื่อดูและแก้ไขด้วย text-editor
Panu Logic


632

แน่นอนประเภทสื่อ MIME ที่ถูกต้องสำหรับ JSON คือapplication/jsonแต่จำเป็นต้องตระหนักถึงชนิดของข้อมูลที่คาดไว้ในแอปพลิเคชันของคุณ

ตัวอย่างเช่นฉันใช้Ext GWTและการตอบกลับของเซิร์ฟเวอร์จะต้องเป็นข้อความ / htmlแต่มีข้อมูล JSON

ฝั่งไคลเอ็นต์ฟังฟอร์ม Ext GWT

uploadForm.getForm().addListener(new FormListenerAdapter()
{
    @Override
    public void onActionFailed(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Error");
    }

    @Override
    public void onActionComplete(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Success");
    }
});

ในกรณีที่ใช้ชนิดการตอบกลับของแอปพลิเคชัน / jsonเบราว์เซอร์แนะนำให้ฉันบันทึกไฟล์

ข้อมูลโค้ดฝั่งเซิร์ฟเวอร์ใช้Spring MVC

return new AbstractUrlBasedView() 
{
    @SuppressWarnings("unchecked")
    @Override
    protected void renderMergedOutputModel(Map model, HttpServletRequest request,
                                           HttpServletResponse response) throws Exception 
    {
        response.setContentType("text/html");
        response.getWriter().write(json);
    }
};

7
การตอบกลับของเซิร์ฟเวอร์จะต้องเป็นข้อความ / html นี่เป็นความจริงสำหรับตัวแปร ExtJS เช่นกัน
gbegley

463

JSON:

การตอบสนองคือข้อมูลที่สร้างขึ้นแบบไดนามิกตามพารามิเตอร์การค้นหาที่ส่งผ่านใน URL

ตัวอย่าง:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

ชนิดของเนื้อหา: application/json


JSON-P:

JSON พร้อมช่องว่างภายใน การตอบสนองคือข้อมูล JSON โดยมีการเรียกใช้ฟังก์ชันล้อมรอบ

ตัวอย่าง:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

ชนิดของเนื้อหา: application/javascript


46
คำจำกัดความของ JSON ไม่ถูกต้อง มันไม่จำเป็นต้องสร้างแบบไดนามิกหรือเคารพพารามิเตอร์แบบสอบถาม คุณสามารถให้บริการไฟล์ JSON แบบคงที่ได้ นอกจากนี้คำตอบที่ upvoted ที่สุดมีลิงก์ไปยัง RFC
สไตล์

10
ด้วย JSONP สามารถเป็นข้อมูล json ที่กำหนดให้กับ var
Jimmy Kane

401

หากคุณใช้ Ubuntu หรือ Debian และให้บริการไฟล์. json ผ่าน Apache คุณอาจต้องการแสดงไฟล์ที่มีประเภทเนื้อหาที่ถูกต้อง ฉันทำสิ่งนี้เป็นหลักเพราะฉันต้องการใช้ส่วนขยายของ Firefox JSONView

โมดูล Apache mod_mimeจะช่วยให้ทำสิ่งนี้ได้อย่างง่ายดาย อย่างไรก็ตามด้วย Ubuntu คุณต้องแก้ไขไฟล์/etc/mime.typesและเพิ่มบรรทัด

application/json json

จากนั้นรีสตาร์ท Apache:

sudo service apache2 restart

44
โดยปกติแล้วการโหลดซ้ำก็เพียงพอแล้ว (เร็วกว่าการรีสตาร์ท) นอกจากนี้โปรดทราบว่าขณะนี้คุณสามารถทำ "sudo service apache2 reload" ได้แล้ว
noamtm

19
Ubuntu 12.04 มีสิ่งนี้ตามค่าเริ่มต้น
Prizoff

386

หากคุณกำลังเรียกใช้บริการเว็บ ASP.NET จากฝั่งไคลเอนต์คุณต้องใช้application/jsonเพื่อให้การทำงาน ฉันเชื่อว่านี่เป็นสิ่งเดียวกันสำหรับjQueryและกรอบงานExt


20
ดูเหมือนว่า jQuery จะทำงานกับ 'application / json' อย่างน้อยและ 'text / plain' ... ฉันยังไม่ได้ลองเลย
นาธาน

jQuery มีความสามารถในการทำงานร่วมกับcontent-Type: text/plain, content-Type: application/json, content-Type: application/json; charset=UTF-8, contentType: "application/x-www-form-urlencoded; charset=UTF-8"
Ashraf.Shk786

307

ประเภทเนื้อหาที่เหมาะสมสำหรับ JSON คือapplication/jsonถ้าคุณกำลังใช้JSONPยังเป็นที่รู้จัก JSON กับ padding ที่เป็นจริงเพื่อให้ JavaScript application/javascriptและประเภทของเนื้อหาที่เหมาะสมจะเป็น


296

ไม่ต้องสงสัยเลยว่าapplication/jsonเป็นประเภทMIME ที่ดีที่สุดสำหรับการตอบสนอง JSON

แต่ฉันมีประสบการณ์บางอย่างที่ฉันต้องใช้application/x-javascriptเพราะปัญหาการบีบอัดบางอย่าง สภาพแวดล้อมในพื้นที่ของฉันคือการร่วมกันพื้นที่กับGoDaddy พวกเขาไม่อนุญาตให้ฉันเปลี่ยนการกำหนดค่าเซิร์ฟเวอร์ ฉันเพิ่มรหัสต่อไปนี้ลงในweb.configไฟล์เพื่อบีบอัดคำตอบ

<httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>

ด้วยการใช้สิ่งนี้เพจ. aspx ถูกบีบอัดด้วย g-zip แต่การตอบสนอง JSON ไม่ได้ ฉันเพิ่ม

<add mimeType="application/json" enabled="true"/>

ในส่วนประเภทคงที่และแบบไดนามิก แต่สิ่งนี้จะไม่บีบอัดการตอบสนองของ JSON เลย

หลังจากนั้นฉันลบประเภทที่เพิ่มใหม่นี้และเพิ่ม

<add mimeType="application/x-javascript" enabled="true"/>

ในทั้งประเภทสแตติกและไดนามิกและเปลี่ยนประเภทการตอบกลับเป็น

.ashx (ตัวจัดการแบบอะซิงโครนัส) เป็น

application/x-javascript

และตอนนี้ฉันพบว่าการตอบสนอง JSON ของฉันถูกบีบอัดด้วย g-zip ดังนั้นฉันแนะนำให้ใช้เป็นการส่วนตัว

application/x-javascript

เฉพาะในกรณีที่คุณต้องการในการบีบอัดการตอบสนอง JSON ของคุณในสภาพแวดล้อมที่ใช้ร่วมกันพื้นที่ เนื่องจากในการโฮสต์ที่ใช้ร่วมกันพวกเขาไม่อนุญาตให้คุณเปลี่ยนการกำหนดค่าIIS


11
"ดังนั้นโดยส่วนตัวฉันแนะนำให้ใช้ application / x-javascript" เป็นคำตอบที่ทำให้เข้าใจผิด GoDaddy ไม่อนุญาตให้มีการบีบอัดของapplication/jsonผมใช้ประโยชน์จากมันในพื้นที่สาธารณะของฉันและฉันจะไม่แนะนำให้ใช้ชนิดเนื้อหาที่แตกต่างกันเพื่อให้สามารถใช้การบีบอัดแล้วมันผิดเพียง มันสามารถทำได้ แต่มันจะยังคงผิด การใช้ประเภทเนื้อหาที่แตกต่างกันสำหรับการสนับสนุนเบราว์เซอร์นั้นเป็นเรื่องหนึ่ง

269

เฉพาะเมื่อใช้application/jsonเป็นชนิด MIMEฉันมีสิ่งต่อไปนี้ (จนถึงเดือนพฤศจิกายน 2011 กับ Chrome เวอร์ชันล่าสุด, Firefox พร้อมFirebug ):

  • ไม่มีคำเตือนจาก Chrome อีกต่อไปเมื่อโหลด JSON จากเซิร์ฟเวอร์
  • Firebug จะเพิ่มแท็บในการตอบกลับซึ่งแสดงข้อมูล JSON ที่จัดรูปแบบคุณ หากประเภท MIME นั้นแตกต่างกันก็จะปรากฏเป็น 'เนื้อหาการตอบสนอง'

244

application/jsonทุกอย่างไม่ทำงานสำหรับชนิดเนื้อหา

หากคุณกำลังใช้ Ext JS<iframe>ส่งแบบฟอร์มการอัปโหลดไฟล์จะต้องทราบว่าการตอบสนองเซิร์ฟเวอร์ถูกแยกวิเคราะห์โดยเบราว์เซอร์ในการสร้างเอกสารสำหรับ

หากเซิร์ฟเวอร์กำลังใช้ JSON เพื่อส่งวัตถุส่งคืนContent-Typeจะต้องตั้งค่าส่วนหัวไว้text/htmlเพื่อบอกให้เบราว์เซอร์แทรกข้อความที่ไม่เปลี่ยนแปลงลงในเนื้อหาเอกสาร

ดูExt JS เอกสาร


40
ควรหลีกเลี่ยงเครื่องมือที่ไม่เป็นไปตามมาตรฐานเมื่อเป็นไปได้ ใช้application/jsonต่อข้อมูลจำเพาะ
one.beat.consumer

15
@ one.beat.consumer ในขณะที่เป็นจริงมันไม่เฉพาะ ExtJs ต่อ se มันเป็นข้อ จำกัด ของเบราว์เซอร์ (หรืออาจเป็น "มาตรการรักษาความปลอดภัย")
Hendy Irawan

7
แน่นอนว่าจะเป็นการดีกว่าถ้าใช้ text / plain ดังนั้นจึงไม่ใช้ความหมาย HTML ใด ๆ กับเนื้อหาที่ไม่ใช่ HTML หรือเบราว์เซอร์ไม่อนุญาตให้คุณดึงเนื้อหาของเฟรมหากไม่มี DOM หรือไม่
ซิงโคร

5
หากต้องการเพิ่มความสับสนต่อ: ฉันแค่การแก้จุดบกพร่องกรณีที่คล้ายกันบน Samsung Galaxy Beam (Android 2.3) กับเบราว์เซอร์เริ่มต้นและiframeดูเหมือนว่าจะเกิดไฟไหม้loadเหตุการณ์สำหรับapplication/javascript, application/x-javascript, text/javascript, text/plainแต่ไม่ยิงมันมิได้application/json text/htmlณ วันนี้ Android <= 2.3 มีส่วนแบ่งการตลาดประมาณ 50% ของ Android
jakub.g

226

JSON เป็นภาษาเฉพาะโดเมน (DSL) และรูปแบบข้อมูลที่เป็นอิสระของ JavaScript และเป็นเช่นนี้มีของตัวเองไมม์application/jsonชนิด เคารพชนิด MIME เป็นลูกค้าแน่นอนขับเคลื่อนดังนั้นtext/plainอาจจะทำสำหรับการถ่ายโอนของไบต์ แต่แล้วคุณจะได้รับการผลักดันขึ้นตีความไปยังโดเมนการประยุกต์ใช้ผู้ขายไม่จำเป็น application/json- คุณจะถ่ายโอน XML ผ่านทางtext/plain?

แต่ตามจริงแล้วตัวเลือกประเภท MIME ของคุณเป็นคำแนะนำสำหรับลูกค้าเกี่ยวกับวิธีการตีความข้อมูล - text/plainหรือtext/HTML(เมื่อไม่ใช่ HTML) เหมือนกับการลบประเภท - มันไม่แปลกใหม่เหมือนกับการทำให้วัตถุประเภทวัตถุทั้งหมดเป็นภาษาที่พิมพ์

ไม่มีเบราว์เซอร์รันไทม์ที่ฉันรู้ว่าจะใช้เอกสาร JSON และทำให้มันพร้อมใช้งานโดยอัตโนมัติในฐานะที่เป็นออบเจ็กต์ที่สามารถเข้าถึงได้ JavaScript โดยไม่มีการแทรกแซง แต่ถ้าคุณทำงานกับไคลเอนต์ที่พิการนั่นเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง แต่นั่นไม่ใช่เรื่องราวทั้งหมด - บริการ JSON RESTfulมักไม่มี JavaScript runtimes แต่มันไม่ได้หยุดพวกเขาโดยใช้ JSON เป็นรูปแบบการแลกเปลี่ยนข้อมูลที่ทำงานได้ หากลูกค้าเป็นคนพิการ ... ฉันจะพิจารณาการฉีด HTML ผ่านทางบริการอาแจ็กซ์เทมเพลตแทน

แอพลิเคชัน / JSON!


210

หากคุณอยู่ในสภาพแวดล้อมฝั่งไคลเอ็นต์การตรวจสอบการสนับสนุนข้ามเบราว์เซอร์เป็นสิ่งจำเป็นสำหรับเว็บแอปพลิเคชันที่ได้รับการสนับสนุนเป็นอย่างดี

HTTP ขวาชนิดเนื้อหาจะapplication/jsonเป็นคนอื่นที่ไฮไลต์อยู่แล้วด้วย แต่ลูกค้าบางคนไม่ได้จัดการกับมันได้เป็นอย่างดีว่าทำไม jQuery text/htmlแนะนำเริ่มต้น



166

อย่างที่คนอื่น ๆ พูดถึงapplication/jsonนั่นคือคำตอบที่ถูก

แต่สิ่งที่ยังไม่ได้อธิบายก็คือตัวเลือกอื่น ๆ ที่คุณเสนอหมายถึงอะไร

  • application/x-javascript: ประเภท MIME แบบทดลองสำหรับ JavaScript ก่อนapplication/javascriptสร้างมาตรฐาน

  • text/javascript: ล้าสมัยแล้ว คุณควรใช้application/javascriptเมื่อใช้จาวาสคริปต์

  • text/x-javascript: ประเภท MIME แบบทดลองสำหรับสถานการณ์ด้านบน

  • text/x-json: ประเภท MIME ทดลองสำหรับ JSON ก่อนapplication/jsonลงทะเบียนอย่างเป็นทางการ

สรุปเมื่อใดก็ตามที่คุณมีข้อสงสัยเกี่ยวกับประเภทเนื้อหาคุณควรตรวจสอบลิงค์นี้


15
เมื่อใดจึงtext/javascriptล้าสมัย? ฉันยังคงกรอกเอกสาร HTML ด้วย<script type="text/javascript" ...แท็ก
Oli

7
มันไม่ได้สร้างความแตกต่างให้เบราว์เซอร์จริงๆ มันล้าสมัยเพียงสำหรับมาตรฐาน RFC: rfc-editor.org/rfc/rfc4329.txt
FCM

16
@Oli คุณสามารถวางได้อย่างปลอดภัยtype="text/javascript"และทำ<script>...</script>อย่างน้อยตาม HTML5
TCB13

149

ในJSPคุณสามารถใช้สิ่งนี้ในหน้าสั่ง:

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>

ที่ถูกต้องMIMEประเภทสื่อ JSON application/jsonคือ JSP จะใช้เพื่อส่งคำตอบไปยังลูกค้า


115

application/json” เป็นประเภทเนื้อหา JSON ที่ถูกต้อง

def ajaxFindSystems = {
  def result = Systems.list()
  render(contentType:'application/json') {
    results {
      result.each{sys->
        system(id:sys.id, name:sys.name)
      }
    }
    resultset (rows:result.size())
  }
}

112

การลงทะเบียนของ IANA สำหรับapplication/jsonพูดว่า

แอปพลิเคชันที่ใช้สื่อประเภทนี้: JSON ถูกใช้เพื่อแลกเปลี่ยนข้อมูลระหว่างแอปพลิเคชันที่เขียนในภาษาการเขียนโปรแกรมเหล่านี้ทั้งหมด: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua CAML, Perl, PHP, Python, Rebol, Ruby, Scala และ Scheme

คุณจะสังเกตเห็นว่า IANA.org ไม่ได้ระบุประเภทสื่ออื่น ๆ เหล่านี้อันที่จริงแม้ในapplication/javascriptปัจจุบันจะล้าสมัยแล้ว ดังนั้นจึงapplication/jsonเป็นคำตอบที่ถูกต้องเท่านั้นที่เป็นไปได้

การสนับสนุนเบราว์เซอร์เป็นอีกสิ่งหนึ่ง

ได้รับการสนับสนุนอย่างกว้างขวางที่สุดที่ไม่ได้มาตรฐานประเภทสื่อหรือtext/json แต่บางชื่อใหญ่ได้ใช้text/javascripttext/plain

แม้แปลกมากก็คือส่วนหัวของเนื้อหาชนิดที่ส่งมาจาก Flickr, text/xmlที่กลับเป็น Google ใช้text/javascriptสำหรับ ajax apis บางตัว

ตัวอย่าง:

curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"

เอาท์พุท: Content-Type: text/javascript

curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"

เอาท์พุท: Content-Type: text/xml


90

ประเภท MIME ที่ถูกต้องคือ application/json

แต่

ฉันประสบกับสถานการณ์มากมายที่ประเภทเบราว์เซอร์หรือผู้ใช้เฟรมเวิร์กต้องการ:

text/html

application/javascript

10
ตัวอย่างของสถานการณ์เช่นนี้?
Mark Amery


66

ชนิดเนื้อหาส่วนหัวควรจะกำหนดให้ ' application / JSON ' โพสต์เมื่อ การฟังเซิร์ฟเวอร์สำหรับคำขอควรมี " Accept = application / json " ใน Spring MVC คุณสามารถทำสิ่งนี้ได้:

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

เพิ่มส่วนหัวในการตอบกลับ:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");


59

ใช้application/jsonงานได้ดีใน PHP เพื่อเก็บข้อมูลอาเรย์หรือวัตถุ

ฉันใช้รหัสนี้เพื่อใส่ข้อมูลใน JSON บนGoogle Cloud Storage (GCS)ซึ่งตั้งค่าให้ดูแบบสาธารณะ :

$context = stream_context_create([
    'gs' => [
        'acl'=>'public-read', 
        'Content-Type' => 'application/json',
    ]
]);

file_put_contents(
    "gs://BUCKETNAME/FILENAME.json", 
    json_encode((object) $array), 
    false, 
    $context
);

หากต้องการรับข้อมูลกลับคืนจะต้อง:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));

50

หาก JSON นั้นมีการเติมเต็มมันจะเป็นapplication/jsonpเช่นนั้น หาก JSON ไม่มีการเติมเต็มมันจะเป็นapplication/jsonเช่นนั้น

ในการจัดการกับทั้งสองวิธีนี้เป็นวิธีปฏิบัติที่ดีในการใช้: 'application / javascript' โดยไม่ต้องกังวลว่าจะมีช่องว่างภายในหรือไม่มีช่องว่างภายใน


8
ส่วนแรกของคำตอบของคุณผิด "application / jsonp" ไม่ใช่ประเภท MIME ที่ถูกต้อง เนื้อหาการตอบสนองของ JSONP เป็นเพียง JavaScript ดังนั้นจึงต้องใช้ MIME ชนิดหนึ่งสำหรับ JavaScript
Rob W


43

การขยายการตอบกลับที่ยอมรับเมื่อคุณใช้ JSON ในบริบท REST ...

มีข้อโต้แย้งเกี่ยวกับการใช้application/x-resource+jsonและapplication/x-collection+jsonเมื่อคุณแสดงถึงทรัพยากรและคอลเลกชัน REST

และหากคุณตัดสินใจที่จะปฏิบัติตามข้อกำหนดjsonapi คุณควรใช้application/vnd.api+jsonเนื่องจากเป็นเอกสาร

ไม่มีมาตรฐานสากลเป็นที่ชัดเจนว่าความหมายที่เพิ่มเข้ากับทรัพยากรที่ถูกถ่ายโอนจัดชิดขอบประเภทเนื้อหาที่ชัดเจนยิ่งกว่าapplication/jsonมากกว่าเพียงแค่

ต่อไปนี้เหตุผลนี้บริบทอื่น ๆ สามารถปรับขึ้นเฉพาะเนื้อหาชนิด


3
application/vnd.api+jsonดูเหมือนว่าจะเป็นเฉพาะสำหรับ apis โดยใช้json: apiสเปคที่แคบมากพร้อมความคาดหวังและรูปแบบของตัวเองฉันไม่เข้าใจว่าเป็นAPI ใด ๆที่ส่งคืน json โปรดแก้ไขให้ฉันด้วยถ้าฉันผิด
Hilikus


39

หากคุณได้รับข้อมูลจาก REST API ใน JSON คุณต้องใช้ประเภทเนื้อหา

For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml

28

Content-Type: application/json- json
Content-Type: application/javascript- json-P
Content-Type: application/x-javascript- javascript
Content-Type: text/javascript- javascript แต่ล้าสมัยรุ่น IE ที่เก่ากว่าใช้ในการใช้เป็นแอตทริบิวต์ html
Content-Type: text/x-javascript- ประเภทสื่อ JavaScript แต่เลิกใช้แล้ว
Content-Type: text/x-json- json ก่อนสมัคร / json ได้ลงทะเบียนอย่างเป็นทางการแล้ว


สำหรับข้อความ JSON: application / json Content-Type: application / json
Vikash Chauhan

28

รูปแบบ JSON (JavaScript Object Notation) และJSONP ("JSON with padding") ดูเหมือนว่าจะคล้ายกันมากและดังนั้นจึงอาจทำให้เกิดความสับสนอย่างมากว่า MIME ชนิดใดที่ควรใช้ แม้ว่ารูปแบบจะคล้ายกัน แต่ก็มีความแตกต่างเล็กน้อยระหว่างรูปแบบเหล่านี้

ดังนั้นเมื่อใดก็ตามที่มีข้อสงสัยฉันมีวิธีการที่ง่ายมาก (ซึ่งใช้ได้ดีในกรณีส่วนใหญ่) คือไปและตรวจสอบเอกสาร RFC ที่เกี่ยวข้อง

JSON RFC 4627 (ประเภทสื่อของแอปพลิเคชัน / json สำหรับสัญลักษณ์วัตถุ JavaScript (JSON)) เป็นข้อกำหนดของรูปแบบ JSON มันบอกว่าในส่วนที่ 6 ว่าไมม์ชนิดของสื่อสำหรับข้อความ JSON คือ

application/json.

JSONP JSONP ("JSON with padding") ได้รับการจัดการในลักษณะที่แตกต่างจาก JSON ในเบราว์เซอร์ JSONP ถือเป็นสคริปต์ JavaScript ปกติดังนั้นจึงควรใช้application/javascript,ประเภท MIME ปัจจุบันอย่างเป็นทางการสำหรับ JavaScript อย่างไรก็ตามในหลายกรณีtext/javascriptMIME type ก็จะทำงานได้ดีเช่นกัน

โปรดทราบว่าtext/javascriptได้รับการทำเครื่องหมายว่าล้าสมัยโดยเอกสารRFC 4329 (ประเภทสื่อสคริปต์) และแนะนำให้ใช้application/javascriptประเภทแทน อย่างไรก็ตามเนื่องจากเหตุผลดั้งเดิมtext/javascriptยังคงใช้กันอย่างแพร่หลายและมีการสนับสนุนข้ามเบราว์เซอร์ (ซึ่งไม่ใช่กรณีที่มีapplication/javascriptประเภท MIME โดยเฉพาะกับเบราว์เซอร์รุ่นเก่า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.