Doğru JSON içerik türü nedir?


10253

Bir süredir JSON ile uğraşıyorum , sadece metin olarak itiyorum ve (kimseyi bildiğim) kimseye zarar vermedi, ama işleri düzgün bir şekilde yapmaya başlamak istiyorum.

JSON içerik türü için bu kadar çok "standart" gördük :

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

Ama hangisi doğru ya da en iyisi? Aralarında değişen güvenlik ve tarayıcı desteği sorunları olduğunu düşünüyorum.

Benzer bir soru olduğunu biliyorum, JSON bir REST API tarafından iade ediliyorsa ne MIME türü? , ama biraz daha hedefli bir cevap istiyorum.

Yanıtlar:


10309

JSON metni için:

application/json

JSON metni için MIME ortam türü application/json. Varsayılan kodlama UTF-8'dir. (Kaynak: RFC 4627 ).

Geri aramalı JSONP (çalıştırılabilir javascript) için:

application/javascript

Alakalı yorumlarda bahsedilen bazı blog yayınları.



Birlikte dosya gönderebilir miyim Json metin?
OPV

7
Internet Explorer bazen application / json ile ilgili sorunlar
yaşıyor

6
Düz metin içeren biri tarafından yazılmış bir belgem olduğunu düşünün. Şimdi bu düz metin sadece geçerli JSON olur. O zaman mime tipi olarak metin / düz kullanmak yanlış olur mu? JSON bir ALT-TÜR metnidir. Bence ikisine de izin verilmeli. Soru, pratikte hangisinin daha iyi çalıştığıdır. Codetoshare tarafından yapılan açıklamaya göre IE application / json ile sorunları var. Ancak hiçbir tarayıcının metin / düz ile ilgili sorunları olmamalıdır. Metin / düz güvensizse, web sitemden metin dosyalarını nasıl sunabilirim?
Panu Logic

5
@EugenMihailescu Bu sayfanın başlığı "MIME türlerinin eksik listesi"
Omegastick

1617

IANA , JSON için resmi MIME Türünüapplication/json .

Neden olmasın sorulduğunda text/json, Crockford JSON'un gerçekten JavaScript veya metin olmadığını ve ayrıca IANA'nın dağıtma olasılığının daha yüksek application/*olduğunu söyledi.text/* .

Daha fazla kaynak:


166
text/*İlk günlerde bölüme muhtemelen bugünlerde bölüme konacak birçok şey konuldu application/*.
TRiG

29
@Rohmer - Bir metin düzenleyicide herhangi bir şeyi "açabilirsiniz", ancak JPEG veya Windows .exe veya .zip gibi bir ikili biçim, birçok metin düzenleyicisini kırabilecek veya istenmeyen davranışlara neden olabilecek yazdırılamayan karakterler içerir. cat file.jpgÖrneğin koşmayı deneyin . Oysa herhangi bir xml veya json dosyası% 100 yazdırılabilir. Bence Stijn de Witt'in amacı geçerli bir konu, evet olmasına rağmen şimdi değiştirmek için çok geç.
XP84

4
@ XP84 Herhangi bir ikili dosyayı bir metin düzenleyicisiyle HEX formunda açabilirsiniz. Ve tüm farklı karakterler (16 tanesi)% 100 yazdırılabilir. Yani, bu mantıkla ... tüm ikili metinler midir? Json metin değildir. Json (uyarı: gayri resmi gevşek tanım önde) bir nesnenin (veya nesne dizisinin ) metin temsilidir
xDaizu

5
"HEX formunda bir metin editörü" ifadesinin bir anlamı yoktur. Onaltılı düzenleyici her baytı onaltılık değeri, örneğin 1111000 baytını "78" olarak gösterir. Onaltılık bir düzenleme moduna sahip olan bazı metin editörleri olsa da, bu en teknik görevleri yerine getiren en teknik kullanıcılar dışında ne yaygın ne de yararlıdır. Metin, karşılaştırma olarak, ASCII veya Unicode anlamına gelir ve metinde, 1111000 baytı küçük harfli xkarakter anlamına gelir . 78 değil. JSON, HTML (text / html) ile aynı şekilde metindir. Yalnızca okunabilir metin karakterleri içerir ve içinde yapılandırılmış anlamı vardır.
XP84

11
Stijn de Witt ile hemfikirim. JSON, bir metin düzenleyici ile görüntülenmeli ve düzenlenmelidir.
Panu Logic

891

JSON için:

Content-Type: application/json

İçin JSON P :

Content-Type: application/javascript

62
JSONP gerçekten JSON değil, bir JavaScript nesnesi değişmezini geçirme tekniği
Benjamin Gruenbaum

632

Tabii ki, JSON için doğru MIME ortam türü application/json , ancak uygulamanızda ne tür verilerin beklendiğini anlamak gerekir.

Örneğin, Ext GWT kullanıyorum ve sunucu yanıtı metin / html olarak gitmeli ancak JSON verileri içeriyor.

İstemci tarafı, Ext GWT form dinleyicisi

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");
    }
});

Application / json yanıt türünün kullanılması durumunda , tarayıcı dosyayı kaydetmemi önerir.

Spring MVC kullanarak sunucu tarafı kaynak kod snippet'i

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
sunucu yanıtı metin / html olarak gitmelidir. Bu, ExtJS varyantı için de geçerlidir.
gbegley

463

JSON:

Yanıt, URL'ye iletilen sorgu parametrelerine göre dinamik olarak oluşturulan verilerdir.

Misal:

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

İçerik türü: application/json


JSON-P:

Dolgu ile JSON. Yanıt, etrafına sarılmış bir işlev çağrısı ile JSON verisidir.

Misal:

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

İçerik türü: application/javascript


46
JSON'un tanımı yanlış. Dinamik olarak oluşturulması veya sorgu parametrelerine uyması gerekmez. Statik bir JSON dosyası sunabilirsiniz. Ayrıca, en çok oylanan cevabın RFC'ye bir bağlantısı vardır.
styfle

10
Ayrıca JSONP bir değişkene atanmış json verileri olabilir.
Jimmy Kane

401

Ubuntu veya Debian kullanıyorsanız ve .json dosyalarını Apache üzerinden sunuyorsanız, dosyaları doğru içerik türünde sunmak isteyebilirsiniz. Bunu öncelikle JSONView Firefox uzantısını kullanmak istediğim için yapıyorum

Apache modülü mod_mime bunu kolayca yapmanıza yardımcı olacaktır. Ancak, Ubuntu ile /etc/mime.types dosyasını düzenlemeniz ve satırı eklemeniz gerekir

application/json json

Ardından Apache'yi yeniden başlatın:

sudo service apache2 restart

44
genellikle yeniden yükleme yeterlidir (yeniden başlatma işleminden daha hızlıdır). Ayrıca, artık "sudo service apache2 reload" yapabileceğinizi unutmayın.
17'de noamtm

19
Ubuntu 12.04 varsayılan olarak buna sahiptir
Prizoff

386

ASP.NET Web Hizmetlerini istemci tarafından çağırıyorsanız application/json, çalışması için kullanmanız gerekir. Bunun jQuery ve Ext çerçeveleri için aynı olduğuna inanıyorum .


20
jQuery en azından 'application / json' ve 'text / plain' ile çalışıyor gibi görünüyor ... Ama diğerlerini denemedim.
Nathan

jQuery ile çalışma yeteneğine sahip 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


296

Hiç şüphe yok ki bir JSON yanıtı için application/jsonen iyi MIME türü.

Ancak application/x-javascriptbazı sıkıştırma sorunları nedeniyle kullanmak zorunda olduğum bir deneyimim oldu . Barındırma ortamım GoDaddy ile paylaşılıyor . Sunucu yapılandırmalarını değiştirmeme izin vermiyorlar. web.configYanıtları sıkıştırmak için dosyama aşağıdaki kodu ekledi .

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

Bunu kullanarak, .aspx sayfaları g-zip ile sıkıştırılmış ancak JSON yanıtları alınmamıştır. ekledim

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

statik ve dinamik türler bölümlerinde. Ancak bu JSON yanıtlarını hiç sıkıştırmaz.

Bundan sonra bu yeni eklenen türü kaldırdım ve ekledim

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

hem statik hem de dinamik türler bölümlerinde ve yanıt türünü

.ashx (eşzamansız işleyici) -

application/x-javascript

Ve şimdi JSON yanıtlarımın g-zip ile sıkıştırıldığını buldum. Bu yüzden kişisel olarak

application/x-javascript

yalnızca JSON yanıtlarınızı paylaşılan bir barındırma ortamında sıkıştırmak istiyorsanız . Çünkü paylaşılan barındırmada, IIS yapılandırmalarını değiştirmenize izin vermezler .


11
"Ben şahsen uygulama / x-javascript kullanmanızı tavsiye" bu yanıtı yanıltıcı hale gelir. GoDaddy yapar sıkıştırılmasına olanak tanıyan application/json, ben benim barındırma paylaşılan üzerinde kaldıraç ve yine sıkıştırmayı etkinleştirmek için farklı bir içerik türünü kullanarak önermek olmaz, sadece yanlış. Bu yapılabilir, ancak yine de yanlış olacaktır. Tarayıcı desteği için farklı içerik türlerini kullanmak bir şeydir, sunucu tarafı sıkıştırma için farklı içerik türlerini kullanmak başka bir şeydir.

269

Yalnızca MIME türü application/jsonolarak kullanıldığında aşağıdakilere sahibim (Kasım 2011'den itibaren Chrome'un en son sürümleriyle, Firebug ile Firefox ):

  • Sunucudan JSON yüklendiğinde artık Chrome'dan uyarı gelmiyor.
  • Firebug, size biçimlendirilmiş JSON verilerini gösteren yanıta bir sekme ekleyecektir. MIME türü farklıysa, yalnızca 'Yanıt içeriği' olarak görünür.

244

İçerik türü için her şey işe yaramaz application/json.

Dosya yüklemek için Ext JS form gönder kullanıyorsanız , sunucunun yanıtını tarayıcı tarafından belge oluşturmak için ayrıştırıldığını unutmayın <iframe>.

Sunucu, dönüş nesnesini göndermek için JSON kullanıyorsa , tarayıcıya metni değişmeden belge gövdesine eklemesini bildirmek için Content-Typeüstbilgi olarak ayarlanmalıdır text/html.

Bkz Ext JS 3.4.0 API belgelerini .


40
Standartlara uymayan araçlardan mümkün olduğunca kaçınılmalıdır; kullanımapplication/jsonşartname başına .
one.beat.consumer

15
@ one.beat.consumer bu doğru olsa da, kendi başına ExtJ'lere özgü değildir. Bu bir tarayıcı sınırlamasıdır (veya daha doğrusu bir "güvenlik önlemi").
Hendy Irawan

7
Şüphesiz, HTML olmayan içeriğe herhangi bir HTML anlambilimi uygulamadığı için metin / düz kullanmak daha iyi olur mu? Veya tarayıcılar DOM yoksa bir çerçevenin içeriğini çıkarmanıza izin vermez mi?
Synchro

5
Daha fazla karışıklığa eklemek için: Sadece varsayılan tarayıcı ile Samsung Galaxy Beam'im (Android 2.3) benzer bir durum ayıklama ediyorum ve iframeyangın gibi görünüyor loadiçin olay application/javascript, application/x-javascript, text/javascript, text/plain, ama DEĞİL için ateş application/jsonne de text/html. Bugün itibariyle, Android <= 2.3, Android pazar payının yaklaşık% 50'sidir.
jakub.g

226

JSON, etki alanına özgü bir dildir (DSL) ve JavaScript'ten bağımsız bir veri biçimidir ve kendi MIME türüne sahiptir application/json,. MIME türlerine saygı elbette müşteri tarafından yönlendirilir, bu nedenle text/plainbayt aktarımı için de yapılabilir, ancak daha sonra yorumu satıcı uygulaması etki alanına gereksiz yere itersiniz - application/json. XML'i üzerinden transfer eder misiniz text/plain?

Ama dürüst olmak gerekirse, MIME türü seçiminiz, verilerin nasıl yorumlanacağı konusunda müşteriye tavsiyedir - text/plainveya text/HTML(HTML değilse) tür silme gibidir - Object türündeki tüm nesnelerinizi yazılı bir dilde yapmak kadar bilgi vermez.

Bildiğim tarayıcı çalışma zamanı yok JSON belgesi alıp otomatik olarak çalışma zamanına müdahale etmeden JavaScript erişilebilir bir nesne olarak kullanılabilir hale getirir, ancak sakat bir istemciyle çalışıyorsanız, bu tamamen farklı bir konudur. Ancak bu hikayenin tamamı değildir - RESTful JSON hizmetlerinin genellikle JavaScript çalışma zamanları yoktur, ancak JSON'u geçerli bir veri değişim formatı olarak kullanmalarını engellemez. Istemciler bu sakat ... o zaman belki de Ajax şablonlama servisi üzerinden HTML enjeksiyon düşünün .

JSON / Uygulama!


210

İstemci tarafı ortamındaysanız, iyi desteklenen bir web uygulaması için tarayıcılar arası desteği araştırmak zorunludur.

Doğru HTTP Content-Type application/json, diğerleri zaten vurgulanmış olduğu gibi olacaktır , ancak bazı istemciler bunu çok iyi işlemez, bu yüzden jQuery varsayılanı önerir text/html.



166

Diğerlerinin de belirttiği gibi, application/json , doğru cevap.

Ancak henüz açıklanmayan şey, önerdiğiniz diğer seçeneklerin ne anlama geldiği.

  • application/x-javascript: Daha önce JavaScript için deneysel MIME türü application/javascriptstandart hale getirildi.

  • text/javascript: Artık kullanılmıyor. Sen kullanmalıdır application/javascriptjavascript kullanırken.

  • text/x-javascript: Yukarıdaki durum için deneysel MIME türü.

  • text/x-json: application/jsonResmi olarak kaydedilmeden önce JSON için deneysel MIME türü .

Sonuç olarak, içerik türleri hakkında herhangi bir şüpheniz olduğunda, bu bağlantıyı kontrol etmelisiniz


15
Ne zaman text/javascriptkullanılmıyor? Hala HTML belgelerini <script type="text/javascript" ...etiketlerle dolduruyorum .
Oli

7
Gerçekten tarayıcılar için bir fark yaratmaz. RFC standartları için artık kullanılmıyor: rfc-editor.org/rfc/rfc4329.txt
fcm

16
@Oli güvenle bırakabilir type="text/javascript"ve <script>...</script>en azından HTML5'e göre yapabilirsiniz .
TCB13

149

In JSP , sayfa yönergede bu kullanabilirsiniz:

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

JSON için doğru MIME ortam türü application/json. JSP bunu istemciye yanıt göndermek için kullanacaktır.


115

application/json” Doğru JSON içerik türüdür.

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

İçin IANA kaydıapplication/json diyor

Bu ortam türünü kullanan uygulamalar: JSON, şu programlama dillerinde yazılmış uygulamalar arasında veri alışverişi için kullanılmıştır: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala ve Şema.

IANA.org'un bu diğer medya türlerini listelemediğini fark edeceksiniz, aslında application/javascriptartık kullanılmıyor. Yani application/jsongerçekten mümkündür doğru cevap.

Tarayıcı desteği başka bir şeydir.

En yaygın olarak desteklenen standart dışı medya türleridir text/jsonya text/javascript. Ama bazı büyük isimler bile kullanıyortext/plain .

Daha da garip olanı, JSON olarak dönen Flickr tarafından gönderilen İçerik Türü başlığıdır text/xml. Google kullanırtext/javascript bazı ajax apis'leri için kullanıyor.

Örnekler:

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

Çıktı: Content-Type: text/javascript

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

Çıktı: Content-Type: text/xml


90

Doğru MIME türü: application/json

FAKAT

Tarayıcı türünün veya çerçeve kullanıcısının ihtiyaç duyduğu birçok durumla karşılaştım:

text/html

application/javascript

10
Böyle bir duruma örnek mi?
Mark Amery

75

Aşağıdakileri kullanıyorum

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

66

İçerik-Tür başlığı 'olarak ayarlanmalıdır uygulama / json ' gönderme. İsteği dinleyen sunucu " Accept = application / json " içermelidir . Bahar MVC'de şöyle yapabilirsiniz:

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

Cevaba üstbilgi ekleyin:

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


59

application/jsonPHP büyük eserler bir dizi veya nesne veri depolamak için.

Ben genel olarak görüntülenebilir olarak ayarlanmış Google Cloud Storage (GCS) JSON veri koymak için bu kodu kullanın :

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

Verileri geri almak oldukça basittir:

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

50

JSON dolgu ile ise o zaman olacak application/jsonp. JSON dolgu içermiyorsa,application/json .

Her ikisiyle de başa çıkmak için kullanmak iyi bir uygulamadır: 'uygulama / javascript' dolgu ile veya dolgu olmadan rahatsız etmeden.


8
Cevabınızın ilk kısmı yanlış. "application / jsonp" geçerli bir MIME türü değil. Bir JSONP'nin yanıt gövdesi yalnızca JavaScript'tir, bu nedenle JavaScript için MIME türlerinden birinin kullanılması gerekir.
Rob W


43

JSON'u bir REST bağlamında kullanırken, kabul edilen yanıtları genişletme ...

Bir yoktur kuvvetli argüman kullanımı hakkında application/x-resource+jsonve application/x-collection+jsonREST kaynakları ve koleksiyonları temsil zaman.

Eğer takip etmeye karar Ve eğer jsonapi şartname, sen gerektiğini kullanımı application/vnd.api+jsono belgelenmiştir olarak.

Evrensel bir standart yoktur olmakla beraber, minimal daha açık haklı Aktarılan olmak kaynaklara semantik ilave açıktır Content-Type sadece dahaapplication/json .

Bu akıl yürütmenin ardından, diğer bağlamlar daha spesifik bir İçerik Türü'nü haklı gösterebilir .


3
application/vnd.api+jsonjson: api , kendi beklentileri ve formatı ile çok dar bir spesifikasyon kullanan apis için özel gibi görünüyor, json döndüren herhangi bir API için olduğunu anlamıyorum . Yanılıyorsam lütfen beni düzeltin
Hilikus

42

PHP geliştiricileri bunu kullanır:

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

    // Do something here...
?>

39

JSON'da REST API'sinden veri alırsanız içerik türünü kullanmanız gerekir

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 AMA eski, html özniteliği olarak kullanılan eski IE sürümleri.
Content-Type: text/x-javascript- JavaScript Medya Türleri AMA eski
Content-Type: text/x-json- uygulama / json resmi olarak kaydedilmeden önce json.


JSON metni için: application / json İçerik Türü: application / json
Vikash Chauhan

28

JSON (JavaScript Nesne Gösterimi) ve JSONP ("dolgu ile JSON") biçimleri çok benzer görünüyor ve bu nedenle hangi MIME türünü kullanmaları çok kafa karıştırıcı olabilir. Biçimler benzer olsa da, aralarında bazı ince farklılıklar vardır.

Herhangi bir şüpheniz olduğunda, çok basit bir yaklaşımım var (çoğu durumda mükemmel şekilde çalışıyor), yani ilgili RFC belgesini kontrol edin.

JSON RFC 4627 (JavaScript Nesne Gösterimi için uygulama / json Media Type (JSON)), JSON formatının bir özelliğidir. 6. bölümde, JSON metni için MIME ortam türünün

application/json.

JSONP JSONP ("dolgu ile JSON") bir tarayıcıda JSON'dan farklı bir şekilde işlenir. JSONP normal bir JavaScript komut dosyası olarak kabul edilir ve bu nedenle JavaScript application/javascript,için geçerli resmi MIME türünü kullanmalıdır . Ancak çoğu durumda, text/javascriptMIME türü de iyi çalışır.

Not text/javascripttarafından eskimiş olarak işaretlendi 4329 RFC (Komut Ortam Türleri) belgesinde ve kullanılması tavsiye edilir application/javascriptyerine türü. Bununla birlikte, eski nedenlerden dolayı, text/javascripthala yaygın olarak kullanılmaktadır ve çapraz tarayıcı desteğine sahiptir (bu application/javascript, özellikle eski tarayıcılarda MIME tipi için her zaman geçerli değildir ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.