jQuery publikuje prawidłowy plik json w treści żądania

180

Więc zgodnie z dokumentacją jQuery Ajax , serializuje dane w postaci ciągu zapytania podczas wysyłania żądań, ale ustawienie processData:falsepowinno pozwolić mi na wysyłanie rzeczywistego JSON w treści. Niestety, mam trudności z ustaleniem najpierw, czy tak się dzieje, a po drugie, jak wygląda obiekt, który jest wysyłany na serwer. Wiem tylko, że serwer nie analizuje tego, co wysyłam.

Kiedy używasz klienta http do wysyłania literału obiektu {someKey:'someData'}, to działa. Ale kiedy używasz jQuery z data: {someKey:'someData'}, zawodzi. Niestety, kiedy analizuję żądanie w Safari, widzę, że ładunek wiadomości jest [object Object]... świetny ... aw Firefoksie post jest pusty ...

Podczas rejestrowania treści ciała po stronie Java dosłownie dostaje się, [object Object]więc jak można wysłać PRAWDZIWE dane JSON?

Czy ktoś miał doświadczenie z usługą Java serializującą dane JSON w treści żądania, z żądaniem wysłanym z jQuery?

BTW tutaj jest pełne żądanie $ .ajax:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});
ćwiek
źródło

Odpowiedzi:

293

Rzeczywiste żądanie JSON wyglądałoby tak:

data: '{"command":"on"}',

Gdzie wysyłasz rzeczywisty ciąg JSON. Aby uzyskać bardziej ogólne rozwiązanie, użyj JSON.stringify()do serializacji obiektu do formatu JSON, na przykład:

data: JSON.stringify({ "command": "on" }),

Aby obsługiwać starsze przeglądarki, które nie mają JSONobiektu, użyj json2.js, który doda go.


To, co się obecnie dzieje, jest takie processData: false, że skoro tak , po prostu wysyłasz to: ({"command":"on"}).toString()czyli [object Object]... to, co widzisz w swojej prośbie.

Nick Craver
źródło
więc nie potrzebuję już processData: false using JSON.stringify()?
brad
6
@brad - zgadza się, po zrobieniu tego nie ma to znaczenia, ponieważ jest to już ciąg znaków, aw takim przypadku jQuery nie będzie go dalej przetwarzać .
Nick Craver
2
działało jak urok, wielkie dzięki! Czy to prawda, że ​​wszystkie treści żądań mają być ciągami, które są analizowane na drugim końcu?
brad
Dlaczego jQuery analizuje dataciąg znaków, zamiast po prostu wysyłać go jako JSON?
Adam Zerner,
Uwaga boczna: jeśli ktoś potrzebuje go jako „ładunku żądania treści” zamiast danych formularza, nie zapomnij dołączyć tego, contentType: "application/json; charset=utf-8",jak wspomniano w tym wątku: stackoverflow.com/questions/21201270/ ...
raydlevel5