Apa jenis konten JSON yang benar?

10256

Saya telah bermain-main dengan JSON selama beberapa waktu, hanya mendorongnya keluar sebagai teks dan tidak menyakiti siapa pun (yang saya tahu), tetapi saya ingin mulai melakukan hal-hal dengan benar.

Saya telah melihat begitu banyak "standar" yang diakui untuk tipe konten JSON:

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

Tapi mana yang benar, atau yang terbaik? Saya mengetahui bahwa ada masalah keamanan dan dukungan browser yang beragam di antara mereka.

Saya tahu ada pertanyaan serupa, Apa tipe MIME jika JSON dikembalikan oleh API REST? , tapi saya ingin jawaban yang sedikit lebih bertarget.

Oli
sumber

Jawaban:

10311

Untuk teks JSON:

application/json

Jenis media MIME untuk teks JSON adalah application/json. Pengkodean default adalah UTF-8. (Sumber: RFC 4627 ).

Untuk JSONP (runnable javascript) dengan panggilan balik:

application/javascript

Berikut adalah beberapa posting blog yang disebutkan dalam komentar yang relevan.

Gumbo
sumber
47
Daftar lengkap tipe MIME
Eugen Mihailescu
Bisakah saya mengirim file bersama teks Json?
OPV
7
Internet Explorer terkadang memiliki masalah dengan aplikasi / json - blog offline
kudlatiger
6
Bayangkan saya memiliki dokumen yang ditulis oleh seseorang yang berisi teks biasa. Sekarang teks biasa itu menjadi JSON yang valid juga. Apakah saya kemudian akan salah menggunakan teks / polos sebagai tipe mime? JSON adalah SUB-TYPE teks. Jadi saya pikir keduanya harus diizinkan. Pertanyaannya adalah mana yang lebih baik dalam praktik. Menurut komentar oleh codetoshare IE memiliki masalah dengan aplikasi / json. Tetapi browser tidak seharusnya memiliki masalah dengan teks / polos. Jika teks / polos tidak aman maka bagaimana saya bisa menyajikan file teks dari situs web saya?
Panu Logic
5
@EugenMihailescu Judul halaman itu adalah "Daftar tipe MIME yang tidak lengkap"
Omegastick
1617

IANA telah mendaftarkan Tipe MIME resmi untuk JSON sebagai application/json.

Ketika ditanya tentang mengapa tidak text/json, Crockford tampaknya mengatakan JSON tidak benar-benar JavaScript atau teks dan juga IANA lebih mungkin untuk membagikan application/*daripada text/*.

Sumber lainnya:

gnrfan
sumber
166
Banyak barang dimasukkan ke dalam text/*bagian di hari-hari awal yang mungkin akan dimasukkan ke application/*bagian hari ini.
TRiG
29
@Rohmer - Anda "dapat" membuka apa saja dalam editor teks, tetapi format biner seperti JPEG atau Windows .exe atau .zip akan berisi karakter yang tidak dapat dicetak yang sebenarnya dapat merusak banyak editor teks atau menyebabkan perilaku yang tidak diinginkan. Coba jalankan cat file.jpgmisalnya. Sedangkan file xml atau json adalah 100% dapat dicetak. Jadi saya pikir poin Stijn de Witt adalah valid, terlepas dari kenyataan bahwa ya, sudah terlambat untuk berubah sekarang.
XP84
4
@ XP84 Anda dapat membuka biner apa saja dengan editor teks dalam bentuk HEX. Dan semua karakter yang berbeda (16 dari mereka) 100% dapat dicetak. Jadi, dengan logika itu ... apakah semua teks biner? Json bukan teks. Json adalah (peringatan: definisi longgar informal di depan) representasi teks dari suatu objek (atau array objek)
xDaizu
5
Tidak ada arti dari frasa "editor teks dalam bentuk HEX". Editor Hex menunjukkan setiap byte sebagai nilai heksadesimalnya, misalnya, byte 1111000 sebagai "78". Walaupun mungkin ada beberapa editor teks yang kebetulan juga memiliki mode pengeditan hex, ini tidak umum atau berguna untuk apa pun kecuali pengguna yang paling teknis melakukan tugas yang paling teknis. Teks, sebagai perbandingan, berarti ASCII atau Unicode, dan dalam teks, byte 1111000 berarti xkarakter huruf kecil. Bukan 78. JSON adalah teks dengan cara yang persis sama dengan HTML (teks / html). Ini hanya berisi karakter teks yang dapat dibaca, dengan makna terstruktur di dalamnya.
XP84
11
Saya cenderung setuju dengan Stijn de Witt. JSON dimaksudkan untuk dilihat dan diedit dengan editor teks.
Panu Logic
891

Untuk JSON:

Content-Type: application/json

Untuk JSON-P :

Content-Type: application/javascript
Alix Axel
sumber
62
JSONP sebenarnya bukan JSON, ini adalah teknik untuk meneruskan objek JavaScript secara literal
Benjamin Gruenbaum
632

Tentu saja, jenis media MIME yang benar untuk JSON adalah application/json , tetapi perlu untuk menyadari jenis data apa yang diharapkan dalam aplikasi Anda.

Sebagai contoh, saya menggunakan Ext GWT dan respons server harus berupa teks / html tetapi berisi data JSON.

Sisi klien, pendengar formulir 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");
    }
});

Dalam hal menggunakan aplikasi / json tipe respons , browser menyarankan saya untuk menyimpan file.

Cuplikan kode sumber sisi server menggunakan 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);
    }
};
Mikhail.Mamaev
sumber
7
respons server harus berupa teks / html. Ini berlaku untuk varian ExtJS juga.
gbegley
463

JSON:

Respons adalah data yang dihasilkan secara dinamis, sesuai dengan parameter kueri yang diteruskan dalam URL.

Contoh:

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

Jenis konten: application/json


JSON-P:

JSON dengan bantalan. Respons adalah data JSON, dengan panggilan fungsi yang melingkupinya.

Contoh:

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

Jenis konten: application/javascript

Bhavin
sumber
46
Definisi JSON salah. Tidak perlu dibuat secara dinamis atau menghormati parameter kueri. Anda dapat melayani file JSON statis. Juga, jawaban yang paling banyak dipilih memiliki tautan ke RFC.
styfle
10
JSONP juga bisa menjadi data json yang ditugaskan untuk var.
Jimmy Kane
401

Jika Anda menggunakan Ubuntu atau Debian dan Anda menyajikan file .json melalui Apache, Anda mungkin ingin menyajikan file dengan tipe konten yang benar. Saya melakukan ini terutama karena saya ingin menggunakan JSONView ekstensi Firefox

Modul Apache mod_mime akan membantu melakukan ini dengan mudah. Namun, dengan Ubuntu Anda perlu mengedit file /etc/mime.types dan menambahkan baris

application/json json

Kemudian restart Apache:

sudo service apache2 restart
Gourneau
sumber
44
biasanya sebuah reload sudah cukup (lebih cepat dari restart). Juga, perhatikan bahwa Anda sekarang dapat melakukan "sudo service apache2 reload".
noamtm
19
Ubuntu 12.04 memiliki ini secara default
Prizoff
386

Jika Anda memanggil Layanan Web ASP.NET dari sisi klien, Anda harus menggunakannya application/jsonagar berfungsi. Saya percaya ini sama untuk kerangka kerja jQuery dan Ext .

markvpc
sumber
20
jQuery tampaknya bekerja dengan setidaknya 'application / json' dan 'text / plain' ... Saya belum pernah mencoba yang lain.
Nathan
jQuery mampu bekerja dengan 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

Jenis konten yang tepat untuk JSON adalah application/jsonKECUALI Anda menggunakan JSONP , juga dikenal sebagai JSON dengan Padding, yang sebenarnya JavaScript dan jenis konten yang tepat application/javascript.

Tolak Desain
sumber
296

Tidak ada keraguan bahwa itu application/jsonadalah MIME terbaik tipe untuk respons JSON.

Tapi saya punya pengalaman di mana saya harus menggunakan application/x-javascriptkarena beberapa masalah kompresi. Lingkungan hosting saya adalah shared hosting dengan GoDaddy . Mereka tidak mengizinkan saya untuk mengubah konfigurasi server. Saya telah menambahkan kode berikut ke web.configfile saya untuk mengompres respons.

<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"/>

Dengan menggunakan ini, halaman .aspx dikompres dengan g-zip tetapi respons JSON tidak. saya tambahkan

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

di bagian tipe statis dan dinamis. Tapi ini tidak mengompres respons JSON sama sekali.

Setelah itu saya menghapus jenis yang baru ditambahkan ini dan menambahkan

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

di bagian tipe statis dan dinamis, dan mengubah tipe respons di

.ashx (penangan asinkron) ke

application/x-javascript

Dan sekarang saya menemukan bahwa respons JSON saya dikompres dengan g-zip. Jadi saya pribadi merekomendasikan untuk menggunakan

application/x-javascript

hanya jika Anda ingin mengompres respons JSON Anda di lingkungan hosting bersama . Karena dalam shared hosting, mereka tidak memungkinkan Anda untuk mengubah konfigurasi IIS .

shashwat
sumber
11
"Jadi saya pribadi merekomendasikan untuk menggunakan aplikasi / x-javascript" adalah tempat jawaban ini menyesatkan. GoDaddy tidak memungkinkan kompresi application/json, saya memanfaatkan itu pada saya shared hosting dan saya tidak akan menyarankan menggunakan jenis konten yang berbeda untuk mengaktifkan kompresi pula, itu hanya salah. Itu bisa dilakukan, tetapi masih akan salah. Menggunakan tipe konten berbeda untuk dukungan browser adalah satu hal, menggunakan tipe konten berbeda untuk kompresi sisi server adalah hal lain.
269

Hanya ketika menggunakan application/jsonsebagai tipe MIME saya memiliki yang berikut (per November 2011 dengan versi Chrome terbaru, Firefox dengan Firebug ):

  • Tidak ada lagi peringatan dari Chrome ketika JSON diambil dari server.
  • Firebug akan menambahkan tab ke respons yang menunjukkan Anda data JSON diformat. Jika tipe MIME berbeda, itu hanya akan muncul sebagai 'Konten respons'.
Ivo Limmen
sumber
244

Tidak semuanya berfungsi untuk tipe konten application/json.

Jika Anda menggunakan formulir Ext JS , kirim untuk mengunggah file, ketahuilah bahwa respons server diuraikan oleh browser untuk membuat dokumen untuk <iframe>.

Jika server menggunakan JSON untuk mengirim objek kembali, maka Content-Typeheader harus diatur ketext/html untuk memberitahu browser untuk memasukkan teks tidak berubah ke dalam badan dokumen.

Lihat dokumentasi API Ext JS 3.4.0 .

Conan
sumber
40
Alat yang tidak mematuhi standar harus dihindari sedapat mungkin; gunakan application/jsonper spec.
one.beat.consumer
15
@ one.beat.consumer sementara itu benar, itu tidak khusus untuk ExtJs per se. Ini adalah batasan browser (atau lebih tepatnya, mungkin, "langkah keamanan").
Hendy Irawan
7
Tentunya akan lebih baik menggunakan teks / polos sehingga tidak berlaku semantik HTML untuk konten non-HTML? Atau jangan browser membiarkan Anda mengekstraksi konten bingkai jika tidak punya DOM?
Sinkronisasi
5
Untuk menambah kebingungan lebih lanjut: Aku hanya debugging kasus serupa pada Samsung Galaxy Beam (Android 2.3) dengan browser default, dan iframetampaknya api loadacara untuk application/javascript, application/x-javascript, text/javascript, text/plain, tapi tidak menembak untuk application/jsonjuga text/html. Pada hari ini, Android <= 2.3 adalah Sekitar 50% dari pangsa pasar Android.
jakub.g
226

JSON adalah bahasa khusus domain (DSL) dan format data independen dari JavaScript, dan karenanya memiliki jenis MIME sendiri application/json,. Menghormati tipe MIME tentu saja didorong oleh klien, jadi text/plainmungkin dilakukan untuk transfer byte, tetapi kemudian Anda akan mendorong interpretasi ke domain aplikasi vendor secara tidak perlu - application/json. Apakah Anda akan mentransfer XML melalui text/plain?

Tapi sejujurnya, pilihan tipe MIME Anda adalah saran kepada klien tentang cara menafsirkan data - text/plainatau text/HTML(jika bukan HTML) seperti tipe penghapusan - sama tidak informatifnya dengan membuat semua objek Anda mengetik Objek dalam bahasa yang diketik.

Tidak ada runtime browser yang saya tahu akan mengambil dokumen JSON dan secara otomatis membuatnya tersedia untuk runtime sebagai objek yang dapat diakses JavaScript tanpa intervensi, tetapi jika Anda bekerja dengan klien yang lumpuh, itu masalah yang sama sekali berbeda. Tapi itu bukan keseluruhan cerita - RESTful layanan JSON sering tidak memiliki runtime JavaScript, tetapi tidak menghentikan mereka menggunakan JSON sebagai format pertukaran data yang layak. Jika klien lumpuh ... maka saya akan mempertimbangkan mungkin injeksi HTML melalui layanan templating Ajax sebagai gantinya.

Aplikasi / JSON!

VLostBoy
sumber
210

Jika Anda berada di lingkungan sisi klien, menyelidiki tentang dukungan lintas-browser wajib untuk aplikasi web yang didukung dengan baik.

Tipe Konten HTTP yang benar adalah application/json, karena yang lain juga telah disorot, tetapi beberapa klien tidak menanganinya dengan baik, itu sebabnya jQuery merekomendasikan default text/html.

Emanuele Del Grande
sumber
170

Jawaban yang benar adalah:

Content-Type: application/json
Irfan DANISH
sumber
166

Seperti yang banyak orang lain katakan, application/jsonadalah jawaban yang benar.

Tetapi apa yang belum dijelaskan adalah apa arti opsi lain yang Anda usulkan.

  • application/x-javascript: Jenis MIME eksperimental untuk JavaScript sebelum application/javascriptdibuat standar.

  • text/javascript: Sekarang sudah usang. Anda harus menggunakan application/javascriptsaat menggunakan javascript.

  • text/x-javascript: Jenis MIME eksperimental untuk situasi di atas.

  • text/x-json: Jenis MIME eksperimental untuk JSON sebelum application/jsondidaftarkan secara resmi.

Semua dalam semua, setiap kali Anda ragu tentang jenis konten, Anda harus memeriksa tautan ini

fcm
sumber
15
Kapan text/javascriptmenjadi usang? Saya masih mengisi dokumen HTML dengan <script type="text/javascript" ...tag.
Oli
7
Tidak ada bedanya untuk browser, sungguh. Itu hanya usang untuk standar RFC: rfc-editor.org/rfc/rfc4329.txt
fcm
16
@ Oli Anda dapat dengan aman menjatuhkan type="text/javascript"dan lakukan <script>...</script>setidaknya sesuai dengan HTML5.
TCB13
149

Di JSP , Anda dapat menggunakan ini dalam arahan halaman:

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

Jenis media MIME yang benar untuk JSON adalah application/json. JSP akan menggunakannya untuk mengirim respons ke klien.

raja
sumber
115

" application/json" Adalah jenis konten JSON yang benar.

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())
  }
}
Sukane
sumber
112

The pendaftaran IANA untukapplication/json mengatakan

Aplikasi yang menggunakan jenis media ini: JSON telah digunakan untuk bertukar data antara aplikasi yang ditulis dalam semua bahasa pemrograman ini: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala, dan Skema.

Anda akan melihat bahwa IANA.org tidak mencantumkan jenis media lain ini , bahkan application/javascriptsekarang sudah usang. Jadi application/jsonbenar-benar satu-satunya jawaban yang mungkin benar .

Dukungan browser adalah hal lain.

Jenis media non-standar yang paling banyak didukung adalah text/jsonatau text/javascript. Tetapi beberapa nama besar bahkan digunakan text/plain.

Yang lebih aneh adalah header Tipe-Konten yang dikirim oleh Flickr, yang mengembalikan JSON sebagai text/xml. Google menggunakan text/javascriptbeberapa apis ajax.

Contoh:

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

Keluaran: Content-Type: text/javascript

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

Keluaran: Content-Type: text/xml


sumber
90

Jenis MIME yang tepat adalah application/json

TAPI

Saya mengalami banyak situasi di mana jenis browser atau kerangka kerja yang dibutuhkan pengguna:

text/html

application/javascript
LombaX
sumber
10
Contoh situasi seperti itu?
Mark Amery
75

Saya menggunakan di bawah ini

contentType: 'application/json',
data: JSON.stringify(SendData),
Andro
sumber
66

The Content-Type header yang harus ditetapkan ke ' aplikasi / json ' ketika posting. Server yang mendengarkan permintaan harus menyertakan " Terima = aplikasi / json ". Di Spring MVC Anda dapat melakukannya seperti ini:

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

Tambahkan tajuk ke respons:

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

Di musim semi Anda memiliki tipe yang ditentukan: MediaType.APPLICATION_JSON_VALUEyang setara dengan application / json .

Chand Priyankara
sumber
2
Itu juga Java EE :: javax.ws.rs.core.MediaType
Eddie B
59

The application/jsonkarya-karya besar di PHP untuk menyimpan array atau objek data.

Saya menggunakan kode ini untuk memasukkan data ke JSON di Google Cloud Storage (GCS) yang diatur agar dapat dilihat secara publik :

$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
);

Untuk mendapatkan kembali data secara langsung:

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

Jika JSON dengan bantalan maka itu akan menjadi application/jsonp. Jika JSON tanpa bantalan maka itu akan menjadi application/json.

Untuk menangani keduanya, ini adalah praktik yang baik untuk menggunakan: 'application / javascript' tanpa peduli apakah itu dengan padding atau tanpa padding.

Ankit Zalani
sumber
8
Bagian pertama dari jawaban Anda salah. "application / jsonp" bukan tipe MIME yang valid. Tubuh respons JSONP hanyalah JavaScript, jadi salah satu tipe MIME untuk JavaScript harus digunakan.
Rob W
50

Untuk JSON, saya menggunakan:

 Content-Type: application/json

Ini dijelaskan dalam proposal Format Pertukaran Data JSON IETF 7158, Bagian 1.2: Spesifikasi JSON .

Mehmet_
sumber
43

Memperluas respons yang diterima, saat Anda menggunakan JSON dalam konteks REST ...

Ada argumen kuat tentang penggunaan application/x-resource+jsondan application/x-collection+jsonkapan Anda mewakili sumber daya dan koleksi REST.

Dan jika Anda memutuskan untuk mengikuti spesifikasi jsonapi , Anda harus menggunakan application/vnd.api+json, seperti yang didokumentasikan.

Meskipun tidak ada standar universal, jelas bahwa semantik yang ditambahkan ke sumber daya yang ditransfer membenarkan Jenis Konten yang lebih eksplisit daripada hanyaapplication/json .

Mengikuti alasan ini, konteks lain dapat membenarkan Tipe Konten yang lebih spesifik .

jgomo3
sumber
3
application/vnd.api+jsontampaknya khusus untuk apis menggunakan json: api , spesifikasi yang sangat sempit dengan harapan dan formatnya sendiri, saya tidak memahaminya untuk API apa pun yang mengembalikan json. Harap perbaiki saya jika saya salah
Hilikus
42

Pengembang PHP menggunakan ini:

<?php
    header("Content-type: application/json");

    // Do something here...
?>
Peter Mortensen
sumber
39

Jika Anda mendapatkan data dari REST API di JSON maka Anda harus menggunakan tipe konten

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
Krishna
sumber
28

Content-Type: application/json- json
Content-Type: application/javascript- json-P
Content-Type: application/x-javascript- javascript
Content-Type: text/javascript- javascript TAPI usang, versi IE yang lebih lama digunakan untuk menggunakan atribut html.
Content-Type: text/x-javascript- Jenis Media JavaScript TETAPI usang
Content-Type: text/x-json- json sebelum aplikasi / json didaftarkan secara resmi.

Kashif Solangi
sumber
Untuk teks JSON: application / json Tipe Konten: application / json
Vikash Chauhan
28

Format JSON (JavaScript Object Notation) dan JSONP ("JSON with padding") tampaknya sangat mirip dan karenanya mungkin sangat membingungkan jenis MIME mana yang harus mereka gunakan. Meskipun formatnya mirip, ada beberapa perbedaan kecil di antara mereka.

Jadi, kapan pun dalam keraguan, saya memiliki pendekatan yang sangat sederhana (yang berfungsi dengan sangat baik dalam kebanyakan kasus), yaitu, pergi dan periksa dokumen RFC yang sesuai.

JSON RFC 4627 (Aplikasi / json Media Type untuk JavaScript Object Notation (JSON)) adalah spesifikasi format JSON. Dikatakan di bagian 6, bahwa jenis media MIME untuk teks JSON adalah

application/json.

JSONP JSONP ("JSON with padding") ditangani dengan cara yang berbeda dari JSON, di browser. JSONP diperlakukan sebagai skrip JavaScript biasa dan karenanya harus menggunakan application/javascript,jenis MIME resmi saat ini untuk JavaScript. Namun, dalam banyak kasus, text/javascripttipe MIME akan berfungsi dengan baik juga.

Catatan yang text/javascripttelah ditandai sebagai usang oleh dokumen RFC 4329 (Jenis Media Scripting) dan disarankan untuk menggunakan application/javascriptjenis. Namun, karena alasan warisan, text/javascriptmasih banyak digunakan dan memiliki dukungan lintas-browser (yang tidak selalu merupakan kasus dengan application/javascripttipe MIME, terutama dengan browser yang lebih lama).

Iresha Rubasinghe
sumber