Wiem, że wszędzie jest wiele podobnych pytań, ale nie mogłem jeszcze zapisać danych z obiektu (arkusza kalkulacyjnego) do pliku JSON.
To jest mój JS:
function (){
var spread = $("#ss").wijspread("spread");
var activeSheet = spread.getActiveSheet();
var dados = JSON.stringify(spread.toJSON());
activeSheet.bind($.wijmo.wijspread.Events.EditChange, function (sender, args) {
console.log(dados);
$.ajax({
url: "script.php",
data: dados,
dataType: "json",
type: "POST"
});
});
}
Dane przesyłane są do konsoli za każdym razem, gdy nastąpią zmiany w arkuszu kalkulacyjnym, plik jest tworzony na serwerze, ale jest pusty.
To jest skrypt.php
$myFile = "/file.json";
$fh = fopen($myFile, "w") or die("impossible to open file");
$stringData = $_POST["data"];
$stringData=json_encode($stringData);
fwrite($fh, $stringData);
fclose($fh);
Odpowiedzi:
2 dla odpowiedzi № 1Szczerze mówiąc, nie wiem, do czego służy podwójne kodowanie JSON w Twoim skrypcie. Podzielę się tym, co tak naprawdę się dzieje:
var dados = JSON.stringify(spread.toJSON());
Zarozumiały spread.toJSON()
zwraca ciąg w formacie JSON, jak sugeruje jego nazwa, w ten sposób uzyskasz podwójną reprezentację obiektu zakodowaną w formacie JSON. Jeśli toJSON
zwraca obiekt, rozważ zmianę nazwy funkcji, ponieważ jest bardzo niejednoznaczna.
Będziemy postępować zgodnie z tym założeniem dados
zawiera teraz prawidłową reprezentację JSON w ciągu.
$.ajax({
url: "script.php",
data: dados,
dataType: "json",
type: "POST"
});
Wysyłasz do script.php
(nie ma tam żadnych wiadomości) i TO jest tam twój pierwszy problem ajax
parametr jest nieprawidłowy, ponieważ data
zawiera Twoje dane, a nie pole data
. Odbywa się to celowo, aby nie utrudniać dostępu do parametrów, takich jak dataType
lub url
(które są dość powszechne). Zamienić:
$.ajax({
url: "script.php",
data: {
data: dados
},
dataType: "json",
type: "POST"
});
Zauważ, że dataType
parametr return zmusi Cię do zwrócenia prawidłowego kodu JSON z kodu PHP, w przeciwnym razie wywołanie AJAX zakończy się niepowodzeniem.
PHP
Po dokonaniu tej modyfikacji, $_POST["data"]
będzie teraz zawierać literał obiektu zakodowany w formacie JSON. Jedyną modyfikacją twojego kodu jest usunięcie json_encode
. Jest już zakodowany. Nie potrzebujesz go więcej.
Myślę, że próbowałeś przekazać treść żądania do swojego kodu, w którym to momencie nie zostałbyś złapany $_POST
ale z obsługą danych wejściowych (fopen(php://input
)
1 dla odpowiedzi nr 2
To świetnie. Miałem ten "" problem i starałem się go rozwiązać. Dziękuję za komentarze stripslashes () rozwiązał ten sam problem również dla mnie.