it-swarm.asia

ما هو نوع محتوى JSON الصحيح؟

لقد تعثرت مع JSON لبعض الوقت ، فقط أخرجه كنص ولم يؤذي أي شخص (أعرفه) ، لكنني أرغب في البدء في عمل الأشياء بشكل صحيح.

لقد رأيت هكذا العديد من "المعايير" المزعومة لنوع محتوى JSON:

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

ولكن أي واحد هو الصحيح ، أو الأفضل؟ أجمع أن هناك مشكلات تتعلق بدعم الأمان والمتصفح تختلف بينهما.

أعرف أن هناك سؤالًا مشابهًا ،ما نوع MIME إذا تم إرجاع JSON بواسطة واجهة برمجة تطبيقات REST؟، ولكني أود إجابة أكثر استهدافًا قليلاً.

9670
Oli

لنص JSON:

application/json

نوع الوسائط MIME لنص JSON هوapplication/json. الترميز الافتراضي هو UTF-8. (المصدر: RFC 4627 ).

ل JSONP (جافا سكريبت runnable) مع رد الاتصال:

application/javascript

فيما يلي بعض مشاركات المدونة التي تم ذكرها في التعليقات ذات الصلة.

9674
Gumbo

IANA قام بتسجيل نوع MIME الرسمي لـ JSON كـapplication/json.

عندما سئل عن سبب عدم text/json ، يبدو أن كروكفورد قد قال إن JSON ليست بالفعل JavaScript ولا نصًا وأيضًا كان IANA يوزع application/* أكثر من text/*.

المزيد من الموارد:

1557
gnrfan

بالنسبة لـ JSON:

Content-Type: application/json

من أجل JSON-P :

Content-Type: application/javascript
833
Alix Axel

بالطبع ، نوع الوسائط MIME الصحيح لـ JSON هو application/json ، لكن من الضروري إدراك نوع البيانات المتوقع في تطبيقك.

على سبيل المثال ، أستخدم Ext GWT ويجب أن تكون استجابة الخادم على النحو التالي text/html لكن يحتوي على بيانات JSON.

جانب العميل ، مستمع نموذج GWT Ext}

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 نوع الاستجابة ، يقترح علي المتصفح حفظ الملف.

مقتطف شفرة المصدر من جانب الخادم باستخدام 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);
    }
};
610
Mikhail.Mamaev

JSON:

يتم إنشاء استجابة البيانات بشكل حيوي ، وفقا لمعلمات الاستعلام التي تم تمريرها في URL.

مثال:

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

نوع المحتوى: application/json


JSON-P:

JSON مع الحشو. الاستجابة هي بيانات JSON ، مع استدعاء وظيفة ملفوفة حولها.

مثال:

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

نوع المحتوى: application/javascript

452
Bhavin

إذا كنت تستخدم Ubuntu أو Debian وتخدم ملفات .json من خلال Apache ، فقد ترغب في تقديم الملفات بنوع المحتوى الصحيح. أقوم بذلك في المقام الأول لأنني أريد استخدام ملحق Firefox JSONView

وحدة Apache mod_mime ستساعد على القيام بذلك بسهولة. ومع ذلك ، مع Ubuntu تحتاج إلى تحرير الملف /etc/mime.types وإضافة السطر

application/json json

ثم أعد تشغيل Apache:

Sudo service Apache2 restart
387
Gourneau

إذا كنت تتصل بـ "خدمات الويب ASP.NET" من جانب العميل ، فعليك استخدام application/json حتى تعمل. أعتقد أن هذا هو نفسه بالنسبة إلى مسج و تحويلة الأطر.

372
markvpc

نوع المحتوى المناسب لـ JSON هو application/json إلا إذا كنت تستخدم JSONP ، والمعروف أيضًا باسم JSON مع Padding ، وهو بالفعل JavaScript وبالتالي فإن نوع المحتوى الصحيح هو application/javascript.

296
Resist Design

ليس هناك شك في أن application/json هو أفضل MIME type لاستجابة 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 التكوينات.

285
shashwat

فقط عند استخدام application/json كـ MIME type لدي ما يلي (اعتبارًا من نوفمبر 2011 مع أحدث إصدارات Chrome ، Firefox with Firebug ):

  • لا مزيد من التحذيرات من Chrome عند تحميل JSON من الخادم.
  • سيضيف Firebug علامة تبويب إلى الاستجابة تظهر لك بيانات JSON المنسقة. إذا كان نوع MIME مختلفًا ، فسيظهر فقط على أنه "محتوى استجابة".
259
Ivo Limmen

لا يعمل كل شيء لنوع المحتوى application/json.

إذا كنت تستخدم Ext JS form يقدم لتحميل الملف ، فاحرص على أن استجابة الخادم يتم تحليلها بواسطة المستعرض لإنشاء وثيقة لـ <iframe>.

إذا كان الخادم يستخدم JSON لإرسال كائن الإرجاع ، فيجب تعيين رأس Content-Type على text/html لإعلام المستعرض بإدراج النص دون تغيير في نص المستند.

انظر Ext JS 3.4.0 API API .

234
Conan

JSON هي لغة خاصة بالمجال (DSL) وتنسيق بيانات مستقل عن جافا سكريبت ، وعلى هذا النحو ، لها MIME type ، application/json. بالطبع ، يحترم العميل أنواع MIME ، لذلك قد تقوم text/plain بنقل وحدات البايت ، ولكن بعد ذلك ستقوم برفع الترجمة إلى مجال تطبيق البائع بشكل غير ضروري - application/json. هل يمكنك نقل XML عبر text/plain؟

ولكن بصراحة ، فإن اختيارك لنوع MIME هو نصيحة للعميل حول كيفية تفسير البيانات text/plain أو text/HTML (عندما لا يكون HTML) يشبه erasure erasure - إنه غير ملائم مثل جعل كل الكائنات من النوع Object في لغة مكتوبة .

لن يستغرق وقت تشغيل المستعرض الذي أعرفه مستند JSON وإتاحته تلقائيًا لوقت التشغيل ككائن JavaScript يمكن الوصول إليه دون تدخل ، ولكن إذا كنت تعمل مع عميل مشلول ، فهذه مسألة مختلفة تمامًا. ولكن ليس هذا هو القصة الكاملة RESTful خدمات JSON غالبًا ما لا تحتوي على أوقات تشغيل جافا سكريبت ، لكنها لا تمنعهم من استخدام JSON كتنسيق تبادل بيانات فعال. إذا كان العملاء مشلولين ... فحينئذٍ سأدرس ربما حقن HTML عبر Ajax templating service بدلاً من ذلك.

التطبيق/JSON!

219
VLostBoy

إذا كنت في بيئة من جانب العميل ، فإن البحث عن دعم المستعرض المتداخل أمر إلزامي لتطبيق ويب مدعوم جيدًا.

سيكون HTTP Content-Type المناسب هو application/json ، كما تم تسليط الضوء على البعض الآخر أيضًا ، لكن بعض العملاء لا يتعاملون معه بشكل جيد للغاية ، ولهذا السبب يوصي jQuery بـ text/html الافتراضي.

203
Emanuele Del Grande

والجواب الصحيح هو:

Content-Type: application/json
161
Irfan DANISH

كما ذكر العديد من الآخرين ، application/json هي الإجابة الصحيحة.

لكن ما لم يتم شرحه بعد هو ما تعنيه الخيارات الأخرى التي اقترحتها.

  • application/x-javascript: نوع MIME التجريبي لجافا سكريبت قبل جعل application/javascript قياسيًا.

  • text/javascript: عفا عليها الزمن الآن. يجب عليك استخدام application/javascript عند استخدام javascript.

  • text/x-javascript: نوع MIME التجريبي للحالة أعلاه.

  • text/x-json: نوع MIME التجريبي لـ JSON قبل أن يتم تسجيل application/json رسميًا.

الكل في الكل ، كلما كان لديك أي شكوك حول أنواع المحتوى ، يجب عليك فحص هذا الرابط

158
fcm

في JSP ، يمكنك استخدام هذا في توجيه الصفحة:

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

نوع الوسائط الصحيح MIME لـ JSON هو application/json. سوف JSP استخدامه لإرسال استجابة إلى العميل.

141
raja

"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())
  }
}
109
Sukane

تسجيل IANA لـ application/json يقول

التطبيقات التي تستخدم نوع الوسائط هذا: تم استخدام JSON لتبادل البيانات بين التطبيقات المكتوبة بجميع لغات البرمجة هذه: أكشن ، C ، C # ، Clojure ، ColdFusion ، Common LISP ، E ، Erlang ، Go ، Java ، JavaScript ، Lua ، Objective CAML و Perl و PHP و Python و Rebol و Ruby و Scala و Scheme.

ستلاحظ أن IANA.org لا تدرج أيًا من أنواع الوسائط الأخرى هذه في الواقع ، حتى application/javascript أصبح الآن قديمًا. إذن application/json هو في الحقيقة الوحيد الممكن الصحيح الإجابة.

دعم المتصفح شيء آخر.

أنواع الوسائط غير القياسية الأكثر دعمًا هي text/json أو text/javascript. لكن بعض الأسماء الكبيرة تستخدم حتى text/plain.

والأكثر غرابة هو رأس Content-Type الذي أرسله Flickr ، والذي يعرض JSON كـ text/xml. تستخدم Google text/javascript لبعض برامج aisax 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

101
Jhawins

نوع MIME الصحيح هوapplication/json

لكن

لقد واجهت العديد من المواقف التي يحتاج فيها نوع المتصفح أو مستخدم الإطار:

text/html

application/javascript
84
LombaX

أنا استخدم أدناه

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

يجب تعيين Content-Type header على ' 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");
63
Alexander Burakevych

في Spring لديك نوع محدد: MediaType.APPLICATION_JSON_VALUE الذي يعادل application/json .

56
Chand Priyankara

يعمل 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"));
56
Chetabahana

بالنسبة إلى JSON ، أنا أستخدم:

 Content-Type: application/json

تم توضيح ذلك في مقترح IETF الخاص بتنسيق تبادل بيانات JSON 7158 ، القسم 1.2: مواصفات JSON .

48
Mehmet_

إذا كان JSON مع الحشو ، فسيكون application/jsonp. إذا كانت JSON بدون حشوة ، فستكون application/json.

للتعامل مع كليهما ، من الممارسات الجيدة استخدام: "application/javascript" دون عناء سواء كان ذلك مع الحشو أو بدون الحشو.

48
Ankit Zalani

تمديد الاستجابات المقبولة ، عندما تستخدم JSON في سياق REST ...

هناك وسيطة قوية حول استخدام application/x-resource+json و application/x-collection+json عندما تمثل REST الموارد والمجموعات.

وإذا قررت اتباع jsonapi specification ، يجب عليك استخدام application/vnd.api+json ، كما هو موثق.

على الرغم من عدم وجود معيار عالمي ، فمن الواضح أن الدلالة المضافة إلى الموارد التي يتم نقلها تبرر نوع المحتوى أكثر من application/json فقط.

باتباع هذا المنطق ، يمكن للسياقات الأخرى أن تبرر نوع المحتوى.

41
jgomo3

يستخدم مطورو PHP هذا:

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

    // Do something here...
?>
40
user3087089

إذا حصلت على بيانات من 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
38
Krishna

يبدو أن تنسيقات JSON (تدوين كائن JavaScript) و JSONP ("JSON with padding") متشابهة جدًا ، وبالتالي قد يكون مربكًا جدًا نوع MIME الذي يجب استخدامه. على الرغم من أن التنسيقات متشابهة ، فهناك بعض الاختلافات الدقيقة بينها.

لذلك كلما كان لدي أي شكوك ، لدي أسلوب بسيط للغاية (والذي يعمل بشكل جيد في معظم الحالات) ، أي اذهب وتحقق من وثيقة RFC المقابلة.

JSONRFC 4627 (نوع وسائط التطبيق/json لترميز كائن JavaScript (JSON)) هو أحد مواصفات تنسيق JSON. يقول في القسم 6 ، أن نوع الوسائط MIME لنص JSON هو

application/json.

JSONPJSONP ("JSON with padding") يتم التعامل معها بطريقة مختلفة عن JSON ، في المتصفح. يتم التعامل مع JSONP كبرنامج نصي جافا سكريبت عادي وبالتالي يجب أن تستخدم application/javascript, نوع MIME الرسمي الحالي لجافا سكريبت. ومع ذلك ، في كثير من الحالات ، يعمل نوع MIME text/javascript بشكل جيد أيضًا.

لاحظ أنه تم وضع علامة text/javascript على أنها قديمة من قبل RFC 4329 ((أنواع وسائط البرمجة النصية)) ويوصى باستخدام نوع application/javascript بدلاً من ذلك. ومع ذلك ، نظرًا للأسباب القديمة ، لا يزال text/javascript يستخدم على نطاق واسع ولديه دعم عبر المستعرض (وهو ما لا يحدث دائمًا مع نوع MIME application/javascript ، خاصة مع المتصفحات القديمة).

24
Iresha Rubasinghe

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 - أنواع وسائط جافا سكريبت لكنها عفا عليها الزمن
Content-Type: text/x-json - json قبل تسجيل التطبيق/json رسميًا.

23
Kashif Solangi

لتحديد نتيجة JSON المثيرة للاهتمام ، يمكنك إضافة "application/json" في رأس طلبك كما يلي:

"قبول: application/json" هو تنسيق استجابة مرغوب.

تحدد "Content-Type: application/json" تنسيق محتوى الطلب الخاص بك ، ولكن في بعض الأحيان تحدد كل من application/json و application/xml ، ولكن قد تكون جودة هذه الأشكال مختلفة. أي خادم سيعيد إرسال تنسيقات الاستجابة المختلفة ، انظر إلى المثال:

Accept:application/json;q=0.4,application/xml;q=8

سيعود هذا XML ، لأن XML له جودة أعلى.

6
behzad babaei

المعيار الحالي المناسب هو application/json. في حين أن الترميز الافتراضي هو UTF-8 ، تجدر الإشارة إلى أنه قد يكون أيضًا UTF-16 أو utf-32. عندما يتم كتابة JSON في UTF-16 أو UTF-32 ، يجب استخدام ترميز نقل المحتوى الثنائي.

هناك المزيد من المعلومات حول json هنا: https://tools.ietf.org/html/rfc4627

مزيد من المعلومات حول ترميز النقل الثنائي هنا: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

5
sammyb123

لاستكمال بقية الإجابات ، نوع MIME للبيانات المرتبطة بـ JSON (JSON-LD) وفقًا لـ W3C هو:

application/ld+json

اكتب الاسم: التطبيق

اسم النوع الفرعي: ld + json

بالإضافة إلى ذلك ، من نفس المصدر:

امتداد (امتدادات) الملف :

.jsonld

5
alejnavab

حاول دائمًا تذكر أنواع المحتوى الثلاثة هذه على الرغم من وجود العديد من أنواع المحتوى . كما قد تضطر إلى استخدام هذه أكثر تواترا.

  • نوع المحتوى: application/json
  • نوع المحتوى: application/xml
  • نوع المحتوى: النص/أتش تي أم أل
1
cherankrish