簡體   English   中英

從服務器檢索JSON.parse()字符串

[英]Retrieving a JSON.parse() string from a server

我將首先說我正在學習如何使用jquery / javascript進行編程,並且使用JSON.parse()遇到問題。 我理解格式,以及人們使用它的原因......但是我無法在任何代碼項目中使用它。

我已經在這里閱讀了書籍/網上如何使用它,但我想我讀了太多。 我現在很困惑,第二次猜測我對它的了解。

話雖如此,我正在使用的jquery / javascript類要求我使用它來進行分配,通過使用MAMP / localhost作為服務器的AJAX。

下面的兩個代碼是我需要填寫// TODO信息的部分。 一個是javascript(客戶端),另一個是php(服務器端)。 我認為我已正確設置了其他// TODO信息,但我一直在為JSON部分獲取令牌錯誤。

我在這里尋找解決方案,但是,我認為我已經非常困惑並需要幫助。 欣賞任何反饋,見解或信息。

-Javascript-

var calculateMpg = function () {
    // These lines are commented out since the server will perform these checks
    // if (!checkNumber("miles") || !checkNumber("gallons")) {
        // return;
    // }
    var miles = $("#miles").val();
    var gallons = $("#gallons").val();
    console.log("ajax request issued.");
    var result;
    $.ajax({
        url: "service.php?action=calculateMPG&miles="+miles+"&gallons="+gallons, 
        cache: false,
        dataType: "text",
        success: function(msg) {
            console.log("ajax response received.");
        //  TODO: parse the JSON string returned from the server (see JSON.parse())
        JSON.parse("result");
        if (result.status === 'success') {
        //  TODO: get the mpg value returned from the server and display it to the user.
            $("#mpg").val($_GET("result"));
            console.log("JSON Working!");
        }
        else {
            // TODO: get the name of the variable with the error. Hint: look at the 'fail' result from service.php 
            $_GET[fail(id)];
            // TODO: report the error to the user using invalidNumber() function.
            alert("{status: 'failure', variable: <variable name>}");
        }
    }
});
};

$(document).ready( function () {
    $("#miles").blur(function () {
        checkNumber("miles");
    });
    $("#gallons").blur(function() {
        checkNumber("gallons");
    });
    $("#calculate").click(calculateMpg);
    $("#miles").focus();
});

-PHP-

<?php
if ($_GET) {
    if ($_GET['action'] == 'calculateMPG') {
        $miles = htmlspecialchars($_GET['miles']);
        $gallons = htmlspecialchars($_GET['gallons']);
        // validate miles
        if (strlen($miles) == 0) {
            fail("miles");
        }
        $miles_chars = str_split($miles);
        for ($i=0; $i< count($miles_chars); $i++) {
            if ($miles_chars[$i] < "0" || $miles_chars[$i] > "9") {
                //error_log("miles_chars check failed at: " + $i);
                fail("miles");
            }
        }
        // validate gallons
        if (strlen($gallons) == 0) {
            fail("gallons");
        }
        $gallons_chars = str_split($gallons);
        for ($i=0; $i< count($gallons_chars); $i++) {
            if ($gallons_chars[$i] < "0" || $gallons_chars[$i] > "9") {
                fail("gallons");
            }
        }
        // validate $miles and $gallons calling $fail along the way
        $result = $miles/$gallons;
        if ($result) {
            success($result);
        } else {
            fail("mpg");
        }
        exit ;
    }
 }

function fail($variable) {
    die(json_encode(array('status' => 'fail', 'variable' => $variable)));
}

function success($message) {
    die(json_encode(array('status' => 'success', 'message' => $message)));
}

編輯附加1我已經更改了關於'var result'的JSON信息(感謝這里的一些響應)。 我開始更好地理解JSON了。

我現在的另一個問題是如何將JSON消息的一部分與整個傳輸隔離開來?

一段'JSON.parse(msg)'返回的DOES包括方程里程/加侖的答案,但我不知道如何...從JSON中提取它。

等式里程/加侖的解決方案出現在'msg'輸出中。

謝謝。

已編輯補充2此問題已解決! 雖然在我之前編輯的部分中圍繞stackoverflow來解決問題的解決方案,但我在這里找到了答案: JSON響應在Javascript中解析以獲得鍵/值對

答案是這樣的:在// TODO部分詢問mpg值,我輸入以下代碼 - $(“#mpg”)。val(result.message); - 表示在變量結果的JSON部分中,取JSON標記為“message”的部分,該值為等式解。

感謝所有回答我們問題解決方案的人。 我很欣賞快速響應,很棒的建議以及理解JSON的信息。

-ECP03

jQuery已經為您提供了一個解析JSON的方便函數,而不是自己解析JSON:

var path = "service.php?action=calculateMPG&miles="+miles+"&gallons="+gallons;
$.getJSON(path, function (data) {
  if (data.status == 'success') {
    console.log('Success! Message:', data.message);
  } else {
    console.log('Failed :( Variable:', data.variable);
  }
});

對於原始代碼,您需要做的是在success回調中調用JSON.parse(msg) ,這將返回一個JavaScript對象,其中包含您從PHP腳本發送的值。 通過在$.ajax調用中指定dataType: 'json' ,jQuery為您完成此操作。 $.getJSON方法為您執行此操作以及其他一些操作。

JSON.parse()要求您向其發送有效的JSON字符串。

"result"不是有效的JSON字符串。 在您的success函數中,您已經定義了一個參數msg - 它包含什么? 在成功函數的開頭嘗試console.log(msg)並查看控制台輸出。

您有兩種選擇:

選項1: - 解析返回的字符串。

改變JSON.parse("result"); 至:

var result = JSON.parse( msg );

選項2: - 請求JSON而不是純文本 - 無需解析

使用$ .getJSON()這是以下的簡寫:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

您需要使用success函數返回的結果:

var result = JSON.parse(msg);

然后,你可以做像result.status這樣的東西。

當您放置JSON.parse("result")您說“解析字符串'結果',”這沒有任何意義。 但是,如果你說JSON.parse(msg)你說的是“解析從ajax動作返回的變量”,這是有道理的。

JSON.parse()用於將您的json數據轉換為對象,然后您可以輕松地操作它。 JSON.parse(msg); 而不是JSON.parse("result") 例如:

var json = '{"value1": "img", "value2":"img2"}'
var obj = JSON.parse(json);
for ( k in obj ) {
    console.log(obj[k])
}

這是完全錯誤的: JSON.parse("result"); .parse()需要一個JSON字符串,例如從你的ajax請求返回的字符串。 你沒有提供那個字符串。 你提供了result這個詞,它不是有效的JSON。

JSON本質上是賦值表達式的右側.eg

var foo = 'bar';
          ^^^^^---this is json
var baz = 42;
          ^^---also json
var qux = ['a', 'b', 'c'];
          ^^^^^^^^^^^^^^^---even more json

var x = 1+2;
        ^^^---**NOT** json... it's an expression.

你在做什么基本上是:

var x = parse;
        ^^^^^^---unknown/undefined variable: not JSON, it's an expression

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM