Pytanie Jaki jest prawidłowy typ zawartości JSON?


Robiłem sobie z tym kłopoty JSON przez jakiś czas, po prostu wypychając go jako tekst i nikogo nie skrzywdził (o czym wiem), ale chciałbym zacząć robić to właściwie.

widziałem więc wiele rzekomych "standardów" dla typu zawartości JSON:

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

Ale co jest poprawne, czy najlepsze? Rozumiem, że między nimi występują problemy z zabezpieczeniami i obsługą przeglądarek.

Wiem, że jest podobne pytanie, Jaki typ MIME, jeśli JSON jest zwracany przez interfejs API REST?, ale chciałbym nieco bardziej ukierunkowanej odpowiedzi.


9201
2018-01-25 15:25


pochodzenie




Odpowiedzi:


Dla tekstu JSON:

application/json

Typ nośnika MIME dla tekstu JSON to application/json. Domyślne kodowanie to UTF-8. (Źródło: RFC 4627).

Dla JSONP (uruchamiany javascript) z funkcją zwrotną:

application/javascript

Oto kilka wpisów na blogu, które zostały wymienione w odpowiednich komentarzach.


9176
2018-01-25 15:27



Pełna lista typów MIME - Eugen Mihailescu
Czy mogę wysłać plik razem z tekstem Json? - OPV
Czy to naprawdę ma znaczenie, jaki ma typ MIME? to tekst, który zostaje sparsowany do obiektu. czy nie byłoby bardziej naturalne przekazanie go jako tekst / zwykły, jeśli chcesz, aby był on otwierany w przeglądarce bez pobierania siły, i aplikacja / strumień-oktetu, jeśli chcesz, aby był on automatycznie pobierany (użyteczny, jeśli generujesz go na strona internetowa przeznaczona do zapisania lokalnie). Czy naprawdę jest tak wiele osób, które będą musiały znać typ mime, aby downloader mógł je wyświetlać za pomocą specjalnej przeglądarki json? Czego mi brakuje, co gwarantuje specjalny typ mime? - Dmitry
Używanie "text / plain" jest ogólnie rzecz biorąc złą praktyką. Istnieją na przykład ataki na platformę internetową, które pozwoliłyby na kradzież danych pochodzących z różnych źródeł, jeśli nie uda się wysłać odpowiedniej wartości typu MIME. - EricLaw
Internet Explorer czasami ma problemy z aplikacją / json - blog jest w trybie offline - codetoshare


IANA zarejestrował oficjalny typ MIME dla JSON as application/json.

Na pytanie, dlaczego nie text/json, Crockford zdaje się mówić, że JSON nie jest tak naprawdę JavaScriptem czy tekstem, a IANA z większym prawdopodobieństwem je rozdawał application/* niż text/*.

Więcej zasobów:


1473
2018-04-07 04:32



Wiele rzeczy zostało włożone w text/* sekcja we wczesnych dniach, które prawdopodobnie zostaną wprowadzone do application/* sekcji tych dni. - TRiG
I to jest wielki błąd imho. JSON to tekst. Może być odczytywany / zapisywany przez dowolny edytor tekstu. Warto o tym wiedzieć, ale nie można z niego wywodzić application/json. Myślę, że byłoby wspaniale mieć wszystko, co można otworzyć za pomocą edytora tekstowego pod text, specyficzne dokumenty XML pod text/xml/xhtml etc ... To naprawdę pomogło w organizacji. - Stijn de Witt
Mogę otworzyć .jpg w moim edytorze tekstu. - Rohmer
@Rohmer - Możesz "otworzyć" wszystko w edytorze tekstu, ale format binarny, taki jak JPEG lub Windows .exe lub .zip, będzie zawierał niedrukowalne znaki, które mogą w rzeczywistości przerwać edytory tekstu lub spowodować niepożądane zachowanie. Spróbuj uruchomić cat file.jpg na przykład. Podczas gdy dowolny plik XML lub json jest w 100% do wydrukowania. Sądzę więc, że punkt Stijna de Witt jest ważny, mimo że tak, teraz jest już za późno na zmiany. - XP84
@ XP84 Możesz otworzyć dowolny plik binarny za pomocą edytora tekstowego w formie HEX. I wszystkie różne znaki (16 z nich) są w 100% do druku. Tak więc dzięki tej logice ... są wszystkie pliki binarne?  Json nie jest tekstem. Json jest (ostrzeżenie: nieformalna luźna definicja z przodu) reprezentacja tekstowa obiektu (lub tablicy obiektów) - xDaizu


Dla JSON:

Content-Type: application/json

Dla JSON-P:

Content-Type: application/javascript

786
2018-06-20 03:10



JSONP nie jest tak naprawdę JSON, jest to technika przekazywania dosłownego obiektu JavaScript - Benjamin Gruenbaum


Oczywiście właściwym typem nośnika MIME dla JSON jest application/json, ale konieczne jest określenie, jakiego rodzaju danych oczekuje się w aplikacji.

Na przykład używam Ext GWT a odpowiedź serwera musi iść w text / html ale zawiera dane JSON.

Strona klienta, Ext słuchacz formularza 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");
    }
});

W przypadku użycia application / json typ odpowiedzi, przeglądarka sugeruje, żebym zapisał plik.

Fragment kodu źródłowego po stronie serwera za pomocą Wiosna 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);
    }
};

584
2017-10-07 14:35



odpowiedź serwera musi być tekstem / html. Dotyczy to również wariantu ExtJS. - gbegley


JSON:

Odpowiedź to dane wygenerowane dynamicznie, zgodnie z parametrami zapytania przekazanymi w adresie URL.

Przykład:

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

Typ zawartości:  application/json


JSON-P:

JSON z wyściółką. Reakcja to dane JSON z zawijaniem funkcji.

Przykład:

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

Typ zawartości:  application/javascript


427
2018-03-28 07:54



Jak to ma mniej głosów niż powyższa odpowiedź, jest bardziej kompletne i zawiera definicje ... - Daniel Waters
@DanielWaters Definicja JSON jest błędna. Nie trzeba go dynamicznie generować ani przestrzegać parametrów zapytania. Możesz obsługiwać statyczny plik JSON. Ponadto najbardziej upvoted odpowiedź ma link do RFC. - styfle
Również JSONP może być jsonem danych przypisanych do var. - Jimmy Kane


Jeśli używasz Ubuntu lub Debiana i obsługujesz pliki .json przez Apache, możesz chcieć udostępnić pliki o poprawnym typie zawartości. Robię to głównie dlatego, że chcę używać rozszerzenia Firefox JSONView

Moduł Apache mod_mime pomoże to łatwo. Jednak w systemie Ubuntu musisz edytować plik /etc/mime.types i dodaj linię

application/json json

Następnie uruchom ponownie Apache:

sudo service apache2 restart

372
2017-11-16 22:58



zwykle wystarczy przeładowanie (szybciej niż restart). Zauważ też, że możesz teraz zrobić "sudo service apache2 reload". - noamtm
Ubuntu 12.04 ma to domyślnie - Prizoff


Jeśli wywołujesz ASP.NET Web Services od strony klienta, musisz użyć application/json żeby działał. Wierzę, że to samo dotyczy jQuery i Zewn ramy.


361
2018-01-25 15:31



jQuery wydaje się działać z co najmniej "application / json" i "text / plain" ... Jednak nie próbowałem wszystkich innych. - Nathan
jQuery jest w stanie pracować z 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