Pracując przy jednym z ostatnich projektów zmuszony byłem przygotować skrypt, który pobierze dane z formularza, dokona walidacji tych dancych, a na koniec prześle je jako JSON z wykorzystaniem AJAX.
W pierwszej chwili wydawało mi się, że najwięcej problemów przyspoży mi przygotowanie danych i konfersja ich do formatu JSON. Myliłem się jednak 🙂 Po pobraniu wszystkich danych z formularza wystarczyło bowiem wstawić do odpowiednio sformatowanej tablicy, a następnie wywołać metodę JSON.stringify i dane już były w porządanym formacie.
Poniżej znajduje się przykład pobierania danych z formularza umożliwiającego konfigurację filtrów JIRA i otrzymanie jej w postaci JSON:
function jiraConfig() { var output = new Array(); var jsonConfig == ""; $("#jiraConfSubmit").click(function(){ $("#jiraConfiguration").find('input[type=text]').each(function(){ var key = $(this).attr('name').substr(6); var internalArray = {}; internalArray["filerTitle"] = $("input[name=jiraTitle"+key+"]").val(); internalArray["filterId"] = $("input[name=jiraId"+key+"]").val(); output.push(internalArray); }) jsonConfig = JSON.stringify(output, null, 2); }); return jsonConfig; }
W wyniku działania tej funkcji uzyskamy dane w postaci JSON:
[ { "filerTitle": "Issues waiting for verification", "filterId": "10545" }, { "filerTitle": "Critical open bugs", "filterId": "11501" } ]
Jak widać otrzymaliśmy pięknego JSON’a. Pozostaje tylko jeszcze przesłanie go z użyciem AJAX. Tutaj z pomocą przychodzi nam jQuery, które wymaga jednak ustawienia dodatkowych parametrów:
$.ajax({ type: 'POST', url: "/targetUrl", data: json, contentType: "application/json; charset=utf-8", dataType: "json", success: function(result) { location.reload(); } });
Wywołanie metody ajax z jQuery nie różni się od standardowego wywołania. Wymaga jedynie dodania dwóch dodatkowych paramtrów:
- dataType: json – wskazuje na typ przesyłanych danych
- contentType: “application/json; charset=utf-8” – powoduje dołączenie odpowiedniego headera do żądania POST
W wywołaniu ajax pominąłem już sekcję wyświetlająca odpowiednie komunikaty w przypadku błędu. Natomiast poprawne przetworzenie żądania spowoduje przeładowanie strony.
Nie wystarczy serializeArray() i później konwersja do JSON. Znalazłem jeszcze coś takiego http://code.google.com/p/form2js/
To było pytanie, zapomniałem “?” 🙂