What is the correct JSON content type?
What is the correct JSON content type?
I've been messing around with JSON for some time, just pushing it out as text and it hasn't hurt anybody (that I know of), but I'd like to start doing things properly.
I have seen so many purported "standards" for the JSON content type:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
But which is correct, or best? I gather that there are security and browser support issues varying between them.
I know there's a similar question, What MIME type if JSON is being returned by a REST API?, but I'd like a slightly more targeted answer.
35 Answers
35
For JSON text:
application/json
application/json
The MIME media type for JSON text is application/json
. The default encoding is UTF-8. (Source: RFC 4627).
application/json
For JSONP (runnable javascript) with callback:
application/javascript
application/javascript
Here are some blog posts that were mentioned in the comments that are relevant.
text/html
application/json
Can I send file together Json text?
– OPV
Jul 23 '17 at 19:42
does it really matter what mime type it has? it's text that gets parsed into an object. wouldn't it be more natural to pass it as text/plain if you want it to be openable in browser without force download, and application/octet-stream if you want it to be automatically downloaded(useful if you're generating it on a webpage intended to be saved locally). Is there really that many people that will need to know the mime type so the downloader can view it with a special json viewer? What am I missing that warrants it a special mime type?
– Dmitry
Aug 23 '17 at 12:00
Using "text/plain" is a bad practice in general. There are, for instance, attacks in the web platform that would allow cross-origin data theft if you fail to send an appropriate MIME type value.
– EricLaw
Nov 21 '17 at 21:27
Internet Explorer sometimes has issues with application/json - blog is offline
– codetoshare
Jun 4 at 3:59
IANA has registered the official MIME Type for JSON as application/json
.
application/json
When asked about why not text/json
, Crockford seems to have said JSON is not really JavaScript nor text and also IANA was more likely to hand out application/*
than text/*
.
text/json
application/*
text/*
More resources:
A lot of stuff got put into the
text/*
section in the early days that would probably be put into the application/*
section these days.– TRiG
Jul 5 '11 at 20:47
text/*
application/*
And that's a big mistake imho. JSON is text. Can be read/written by any text editor. That is valuable to know, but cannot be derived from
application/json
. I think it would have been great to have everything that can be opened with a text editor under text
, specific XML doctypes under text/xml/xhtml
etc... It would really have helped in organizing.– Stijn de Witt
Apr 10 '17 at 7:29
application/json
text
text/xml/xhtml
I can open a
.jpg
in my text editor.– Rohmer
Dec 5 '17 at 17:12
.jpg
@Rohmer - You "can" open anything in a text editor, but a binary format like JPEG or a Windows .exe or a .zip will contain non-printable characters which can actually break many text editors or cause undesired behavior. Try running
cat file.jpg
for example. Whereas any xml or json file is 100% printable. So I think Stijn de Witt's point is a valid one, despite the fact that yes, it's too late to change now.– XP84
Jan 16 at 20:59
cat file.jpg
@XP84 You can open any binary with a text editor in HEX form. And all the different characters (the 16 of them) are 100% printable. So, by that logic... are all binaries text? Json is not text. Json is (warning: informal loose definition ahead) a text representation of an object (or array of objects)
– xDaizu
Apr 5 at 11:55
For JSON:
Content-Type: application/json
For JSON-P:
Content-Type: application/javascript
JSONP is not really JSON though, it's a technique for passing a JavaScript object literal
– Benjamin Gruenbaum
Sep 8 '13 at 6:44
Of course, the correct MIME media type for JSON is application/json
, but it's necessary to realize what type of data is expected in your application.
application/json
For example, I use Ext GWT and the server response must go as text/html but contains JSON data.
Client side, Ext GWT form listener
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");
);
In case of using application/json response type, the browser suggests me to save the file.
Server side source code snippet using 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);
;
server response must go as text/html. This is true for the ExtJS variant as well.
– gbegley
Oct 30 '12 at 21:10
Response is dynamically generated data, according to the query parameters passed in the URL.
Example:
"Name": "Foo", "Id": 1234, "Rank": 7
Content-Type: application/json
application/json
JSON with padding.
Response is JSON data, with a function call wrapped around it.
Example:
functionCall("Name": "Foo", "Id": 1234, "Rank": 7);
Content-Type: application/javascript
application/javascript
How does this have less votes than the above answer, it's more complete and contains definitions..
– Daniel Waters
Jun 12 '13 at 11:02
@DanielWaters The definition of JSON is wrong. It does not need to be dynamically generated or respect query parameters. You can serve a static JSON file. Also, the most upvoted answer has a link to the RFC.
– styfle
Jan 29 '14 at 1:37
Also JSONP can be json data assigned to a var.
– Jimmy Kane
Jan 30 '14 at 13:16
If you are using Ubuntu or Debian and you serve .json files through Apache, you might want to serve the files with the correct content type. I am doing this primarily because I want to use the Firefox extension JSONView
The Apache module mod_mime will help to do this easily. However, with Ubuntu you need to edit the file /etc/mime.types and add the line
application/json json
Then restart Apache:
sudo service apache2 restart
usually a reload is enough (faster than restart). Also, note that you can now do "sudo service apache2 reload".
– noamtm
Jan 19 '11 at 17:37
Ubuntu 12.04 has this by default
– Prizoff
May 25 '12 at 17:52
If you're calling ASP.NET Web Services from the client-side you have to use application/json
for it to work. I believe this is the same for the jQuery and Ext frameworks.
application/json
jQuery seems to work with at least 'application/json' and 'text/plain'... I haven't tried all the others though.
– Nathan
Mar 18 '10 at 19:30
jQuery is capable of working with
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
Jul 27 '17 at 11:13
content-Type: text/plain
content-Type: application/json
content-Type: application/json; charset=UTF-8
contentType: "application/x-www-form-urlencoded; charset=UTF-8"
The right content type for JSON is application/json
UNLESS you're using JSONP, also known as JSON with Padding, which is actually JavaScript and so the right content type would be application/javascript
.
application/json
application/javascript
There is no doubt that application/json
is the best MIME type for a JSON response.
application/json
But I had some experience where I had to use application/x-javascript
because of some compression issues. My hosting environment is shared hosting with GoDaddy. They do not allow me to change server configurations. I had added the following code to my web.config
file for compressing responses.
application/x-javascript
web.config
<httpCompression>
<scheme name="gzip" dll="%Windir%system32inetsrvgzip.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"/>
By using this, the .aspx pages was compressed with g-zip but JSON responses were not. I added
<add mimeType="application/json" enabled="true"/>
in the static and dynamic types sections. But this does not compress JSON responses at all.
After that I removed this newly added type and added
<add mimeType="application/x-javascript" enabled="true"/>
in both the static and dynamic types sections, and changed the response type in
.ashx (asynchronous handler) to
application/x-javascript
And now I found that my JSON responses were compressed with g-zip. So I personally recommend to use
application/x-javascript
only if you want to compress your JSON responses on a shared hosting environment. Because in shared hosting, they do not allow you to change IIS configurations.
"So I personally recommending to use application/x-javascript" is where this answer becomes misleading. GoDaddy does allow compression of
application/json
, I leverage it on my shared hosting and I wouldn't suggest using a different content type to enable compression anyway, it's simply wrong. It can be done, but it will still be wrong. Using different content types for browser support is one thing, using different content types for server-side compression is another.– Lady Bird
Dec 11 '14 at 16:20
application/json
Only when using application/json
as the MIME type I have the following (as of November 2011 with the most recent versions of Chrome, Firefox with Firebug):
application/json
Not everything works for content type application/json
.
application/json
If you are using Ext JS form submit to upload file, be aware that the server response is parsed by the browser to create the document for the <iframe>
.
<iframe>
If the server is using JSON to send the return object, then the Content-Type
header must be set to text/html
in order to tell the browser to insert the text unchanged into the document body.
Content-Type
text/html
See the Ext JS 3.4.0 API documentation.
Tools that don't adhere to standards should be avoided whenever possible; use
application/json
per spec.– one.beat.consumer
Feb 16 '12 at 2:05
application/json
@one.beat.consumer while that is true, it's not specific to ExtJs per se. It's a browser limitation (or rather, perhaps, a "security measure").
– Hendy Irawan
Feb 24 '12 at 15:54
Surely it would be better to use text/plain so it doesn't apply any HTML semantics to non-HTML content? Or don't browsers let you extract a frame's content if it's got no DOM?
– Synchro
Aug 10 '12 at 12:34
To add further confusion: I'm just debugging a similar case on Samsung Galaxy Beam (Android 2.3) with default browser, and the
iframe
seems to fire load
event for application/javascript
, application/x-javascript
, text/javascript
, text/plain
, but NOT firing it for application/json
nor text/html
. As of today, Android <=2.3 is About 50% of the Android market share.– jakub.g
Jul 5 '13 at 12:41
iframe
load
application/javascript
application/x-javascript
text/javascript
text/plain
application/json
text/html
JSON is a domain-specific language (DSL) and a data format independent of JavaScript, and as such has its own MIME type, application/json
. Respect for MIME types is of course client driven, so text/plain
may do for transfer of bytes, but then you would be pushing up interpretation to the vendor application domain unnecessarily - application/json
. Would you transfer XML via text/plain
?
application/json
text/plain
application/json
text/plain
But honestly, your choice of MIME type is advice to the client as to how to interpret the data- text/plain
or text/HTML
(when it's not HTML) is like type erasure- it's as uninformative as making all your objects of type Object in a typed language.
text/plain
text/HTML
No browser runtime I know of will take a JSON document and automatically make it available to the runtime as a JavaScript accessible object without intervention, but if you are working with a crippled client, that's an entirely different matter. But that's not the whole story- RESTful JSON services often don't have JavaScript runtimes, but it doesn't stop them using JSON as a viable data interchange format. If clients are that crippled... then I would consider perhaps HTML injection via an Ajax templating service instead.
Application/JSON!
If you're in a client-side environment, investigating about the cross-browser support is mandatory for a well supported web application.
The right HTTP Content-Type would be application/json
, as others already highlighted too, but some clients do not handle it very well, that's why jQuery recommends the default text/html
.
application/json
text/html
The correct answer is:
Content-Type: application/json
As many others have mentioned, application/json
is the correct answer.
application/json
But what haven't been explained yet is what the other options you proposed mean.
application/x-javascript
: Experimental MIME type for JavaScript before application/javascript
was made standard.
application/x-javascript
application/javascript
text/javascript
: Now obsolete. You should use application/javascript
when using javascript.
text/javascript
application/javascript
text/x-javascript
: Experimental MIME type for the above situation.
text/x-javascript
text/x-json
: Experimental MIME type for JSON before application/json
got officially registered.
text/x-json
application/json
All in all, whenever you have any doubts about content types, you should check this link
When did
text/javascript
become obsolete? I'm still filling up HTML documents with <script type="text/javascript" ...
tags.– Oli
Apr 2 '13 at 12:23
text/javascript
<script type="text/javascript" ...
It makes no difference for browsers, really. It's just obsolete for RFC standards: rfc-editor.org/rfc/rfc4329.txt
– fcm
Apr 2 '13 at 12:34
@Oli you can safely drop
type="text/javascript"
and just do <script>...</script>
at least according to HTML5.– TCB13
Jun 27 '13 at 21:41
type="text/javascript"
<script>...</script>
In JSP, you can use this in page directive:
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
The correct MIME media type for JSON is application/json
. JSP will use it for sending a response to the client.
application/json
“application/json
” is the correct JSON content type.
application/json
def ajaxFindSystems =
def result = Systems.list()
render(contentType:'application/json')
results
result.eachsys->
system(id:sys.id, name:sys.name)
resultset (rows:result.size())
The IANA registration for application/json
says
application/json
Applications that use this media type: JSON has been used to
exchange data between applications written in all of these
programming languages: ActionScript, C, C#, Clojure, ColdFusion,
Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML,
Perl, PHP, Python, Rebol, Ruby, Scala, and Scheme.
You'll notice that IANA.org doesn't list any of these other media types, in fact even application/javascript
is now obsolete. So application/json
is really the only possible correct answer.
application/javascript
application/json
Browser support is another thing.
The most widely supported non-standard media types are text/json
or text/javascript
. But some big names even use text/plain
.
text/json
text/javascript
text/plain
Even more strange is the Content-Type header sent by Flickr, who returns JSON as text/xml
. Google uses text/javascript
for some of it's ajax apis.
text/xml
text/javascript
Examples:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Output: Content-Type: text/javascript
Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Output: Content-Type: text/xml
Content-Type: text/xml
The right MIME type is application/json
application/json
BUT
I experienced many situations where the browser type or the framework user needed:
text/html
application/javascript
Example of such a situation?
– Mark Amery
Jun 4 '14 at 19:29
I use the below
contentType: 'application/json',
data: JSON.stringify(SendData),
The Content-Type header should be set to 'application/json' when posting. Server listening for the request should include "Accept=application/json".
In Spring MVC you can do it like this:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Add headers to the response:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
In Spring you have a defined type: MediaType.APPLICATION_JSON_VALUE
which is equivalent to application/json.
MediaType.APPLICATION_JSON_VALUE
That's Java EE too :: javax.ws.rs.core.MediaType
– Eddie B
Feb 28 '14 at 3:01
The application/json
works great in PHP to store an array or object
data.
application/json
I use this code to put data in JSON on Google Cloud Storage (GCS) which is set publically viewable:
$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
);
To get back the data is straight forward:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
If the JSON is with padding then it will be application/jsonp
. If the JSON is without padding then it will be application/json
.
application/jsonp
application/json
To deal with both, it is a good practice to use: 'application/javascript' without bothering whether it is with padding or without padding.
The first part of your answer is wrong. "application/jsonp" is not a valid MIME type. The response body of a JSONP is just JavaScript, so one of the MIME-types for JavaScript has to be used.
– Rob W
Aug 30 '13 at 16:14
For JSON, I am using:
Content-Type: application/json
This is described in the IETF's JSON Data Interchange Format 7158 proposal, Section 1.2: Specifications of JSON.
PHP developers use this:
<?php
header("Content-type: application/json");
// Do something here...
?>
Extending the accepted responses, when you are using JSON in a REST context...
There is a strong argument about using application/x-resource+json
and application/x-collection+json
when you are representing REST resources and collections.
application/x-resource+json
application/x-collection+json
And if you decide to follow the jsonapi specification, you should use of application/vnd.api+json
, as it is documented.
application/vnd.api+json
Altough there is not an universal standard, it is clear that the added semantic to the resources being transfered justify a more explicit Content-Type than just application/json
.
application/json
Following this reasoning, other contexts could justify a more specific Content-Type.
application/vnd.api+json
seems to be specifically for apis using json:api, a very narrow specification with its own expectations and format, I don't understand it to be for any API that returns json. Please correct me if I'm wrong– Hilikus
Jul 25 '16 at 22:49
application/vnd.api+json
@Hilikus: You are certainly right. I'll fix the answer to reflect this.
– jgomo3
Jul 27 '16 at 0:53
If you get data from REST API in JSON so you have to use content-type
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
JSON (JavaScript Object Notation) and JSONP ("JSON with padding") formats seems to be very similar and therefor it might be very confusing which MIME type they should be using. Even though the formats seems to be very similar, there are some subtle differences between them.
So whenever in any doubts, I have very simple approach (which works perfectly find in most cases), namely, go and check corresponding RFC document.
JSON
RFC 4627 (The application/json Media Type for JavaScript Object Notation (JSON)) is a specifications of JSON format. It says in section 6, that the MIME media type for JSON text is
application/json.
JSONP
JSONP ("JSON with padding") is handled different way than JSON, in a browser. JSONP is treated as a regular JavaScript script and therefor it should use application/javascript,
the current official MIME type for JavaScript. In many cases, however, text/javascript
MIME type will work fine too.
application/javascript,
text/javascript
Note that text/javascript
has been marked as obsolete by RFC 4329 (Scripting Media Types) document and it is recommended to use application/javascript
type instead. However, due to legacy reasons, text/javascript
is still widely used and it has cross-browser support (which is not always a case with application/javascript
MIME type, especially with older browsers).
text/javascript
application/javascript
text/javascript
application/javascript
Content-type: application/json
- jsonContent-Type: application/javascript
- json-PContent-type: application/x-javascript
- javascriptContent-type: text/javascript
- javascript BUT obsolete, older IE versions used to use as html attribute.Content-type: text/x-javascript
- JavaScript Media Types BUT obsoleteContent-type: text/x-json
- json before application/json got officially registered.
Content-type: application/json
Content-Type: application/javascript
Content-type: application/x-javascript
Content-type: text/javascript
Content-type: text/x-javascript
Content-type: text/x-json
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
Complete list of MIME types
– Eugen Mihailescu
Apr 4 '17 at 5:08