Jak wysłać JSON zamiast ciągu zapytania z $.ajax?

Czy ktoś może w prosty sposób wyjaśnić, jak sprawić, by jQuery wysyłało rzeczywisty JSON zamiast ciągu zapytania?

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});

To w rzeczywistości przekonwertuje Twój starannie przygotowany JSON na ciąg zapytania. Jedną z irytujących rzeczy jest to, że dowolny array: [] w Twoim obiekcie zostanie przekonwertowany na array[]: [], prawdopodobnie z powodu ograniczeń Żądła zapytania.

Author: Xufox, 2012-10-02

4 answers

Musisz użyć JSON.stringify aby najpierw serializować obiekt do JSON, a następnie określić contentType, aby serwer zrozumiał, że to JSON. To powinno wystarczyć:

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

Zauważ, że obiekt JSON jest natywnie dostępny w przeglądarkach obsługujących JavaScript 1.7 / ECMAScript 5 lub nowszy. Jeśli potrzebujesz wsparcia starszego typu, możesz użyć json2.


te dodatkowe szczegóły zostały pierwotnie błędnie zawarte w poprzedniej wersji pytanie. Zostały skopiowane do tej zaakceptowanej odpowiedzi.

Należy pamiętać, że wymaga to odpowiednich CORS nagłówków po stronie serwera, a w przeciwieństwie do niektórych przykładów w sieci, Allow-Headers nie można używać symboli wieloznacznych (podczas gdy Allow-Origin można).

{
    Content-Type                 : 'application/json', 
    Access-Control-Allow-Origin  : '*', 
    Access-Control-Allow-Headers : 'Content-Type' // You cannot use '*'
}

Zauważ również, że jQuery wyśle teraz dwa żądania, jeden do zakończenia uścisku dłoni i jeden z rzeczywistą treścią. Jest to normalne zachowanie HTTP o nazwie pre-flight. Pierwsze żądanie będzie OPTIONS nagłówka w celu ustalenia, czy serwer jest rzeczywiście zgodny z planowanym żądaniem.

Więc pamiętaj, jeśli chcesz, aby twój serwer był wszechstronny, używając ciąg zapytania wysyła tylko jedno żądanie. Użycie true JSON wysyła co najmniej dwa żądania, jedno dla uścisku dłoni.

 227
Author: mekwall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-29 07:01:02

No, the dataType Opcja {[9] } służy do przetwarzania odebranych danych.

Aby opublikować JSON, musisz sam go dodać poprzez JSON.stringify i ustaw opcję processData na false.

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

Zauważ, że nie wszystkie przeglądarki obsługują obiekt JSON i chociaż jQuery ma .parseJSON, nie ma dołączonego stringifier; będziesz potrzebował innej biblioteki polyfill.

 26
Author: Bergi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-31 05:38:16

Choć znam wiele architektur takich jak ASP.NET MVC mają wbudowaną funkcjonalność obsługi JSON.stringify jako treść Moja sytuacja jest trochę inna więc może to komuś pomoże w przyszłości. Wiem, że zaoszczędziłoby mi to godziny!

Ponieważ moje żądania http są obsługiwane przez API CGI z IBM (środowisko AS400) na innej subdomenie, żądania te są pochodzenia krzyżowego, stąd jsonp. I rzeczywiście wysłać mój ajax przez obiekt javascript(s). Oto przykład mojego Ajaksa POST:

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });
 5
Author: yardpenalty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 16:22:54

Jeśli wysyłasz to do asp.net i potrzebuje danych w żądaniu.form[] następnie musisz ustawić typ zawartości na "application / x-www-form-urlencoded; charset=utf-8"

Original post here

Po drugie pozbądź się typu danych, jeśli nie spodziewasz się zwrotu POST będzie czekał około 4 minut przed niepowodzeniem. Zobacz TUTAJ

 1
Author: Tod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:42