Titanium - PHP+JSON 错误解析

Titanium - PHP+JSON error parsing

我正在开发一个简单的应用程序来登录面板,与 Mysql 数据库进行交互。 在我的应用程序中创建一个 HTTP 客户端来登录或注册新用户。

进入index.js我放了登录代码,在newuser.js我放了注册代码。

我创建了一个 HTTP 客户端来注册新用户,在 newuser.js

createReq = Titanium.Network.createHTTPClient();


createReq.onload = function() {
Titanium.API.info("Start onload");
var jsonReg = this.responseText;
var resultReg = JSON.parse(jsonReg);
Titanium.API.info("Start IF");

if (resultReg.registered == false) {
    alert('utente esistente');
    $.view_indicator.hide();
    Titanium.API.info("user NOT registered");

    } else if(resultReg.registered == true) {
    alert('utente NON esistente');
    $.view_indicator.hide();
    Titanium.API.info("user registered");

    }

}



function createUser () {
if ( $.user.value != '' && $.pass.value != '' && $.pass_check.value != '' && $.name.value != '' && $.email.value != '' ) {

    if ($.pass.value != $.pass_check.value) {
        alert("Le password non coincidono.")
    } else {
        if (!check_email($.email.value)) {
            alert("Inserisci una email valida");
        } else {
            createReq.open("POST", "http://solimeo.sviluppofacile.it/register.php");
            var params = {
                username: $.user.value,
                password: Ti.Utils.md5HexDigest($.pass.value),
                name: $.name.value,
                email: $.email.value
            };
            $.view_indicator.show();
            createReq.send(params);
        };
        $.user.blur();
        $.pass.blur();
        $.pass_check.blur();
        $.name.blur();
        $.email.blur();
    };

} else {
    alert("Tutti i campi sono obbligatori!");
};

}
本例中的

JSON 数据来自此 PHP 页面,register.php

<?php

include ('connection.php');

$username = $_POST['username'];
$password = $_POST['password'];
$name = $_POST['name'];
$email = $_POST['email'];

$sql = "SELECT username,email FROM users WHERE username = '" . $username . "' OR email = '" . $email . "'";
$query = mysql_query($sql);

if (mysql_num_rows($query) > 0) {

$response = array('registered' => false, 'message' => 'Utente che esiste');

echo json_encode($response);

} else {

$insert = "INSERT INTO users (username,password,name,email) VALUES ('" . $username . "','" . $password . "','" . $name . "','" . $email . "')";
$query  = mysql_query($insert);

if ($query) {
    //echo "Utente correttamente registrato! Puoi ora loggarti.";
$response = array('registered' => true, 'message' => 'Utente correttamente registrato! Puoi ora loggarti.');
echo json_encode($response);
} else {
    //echo "Registrazione fallita";
$response = array('registered' => false, 'message' => 'Registrazione fallita.');
echo json_encode($response);
}
}

mysql_close($connect) or die (mysql_error());
?>

但是如果我尝试注册一个已经存在的用户,我会遇到这个错误

[ERROR] :  V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
[ERROR] :  XMLModule: (KrollRuntimeThread) [46894,49752] Error parsing XML
[ERROR] :  XMLModule: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"registered":fa...@2:1 in java.io.InputStreamReader@429a8648)
[ERROR] :  XMLModule:   at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
[ERROR] :  XMLModule:   at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
[ERROR] :  XMLModule:   at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
[ERROR] :  XMLModule:   at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
[ERROR] :  XMLModule:   at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:700)
[ERROR] :  XMLModule:   at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:107)
[ERROR] :  XMLModule:   at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
[ERROR] :  XMLModule:   at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73)
[ERROR] :  XMLModule:   at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1121)
[ERROR] :  XMLModule:   at android.os.Handler.dispatchMessage(Handler.java:98)
[ERROR] :  XMLModule:   at android.os.Looper.loop(Looper.java:146)
[ERROR] :  XMLModule:   at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)
[ERROR] :  TiHttpClient: (KrollRuntimeThread) [1,49753] Error parsing XML
[ERROR] :  TiHttpClient: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"registered":fa...@2:1 in java.io.InputStreamReader@429a8648)
[ERROR] :  TiHttpClient:    at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
[ERROR] :  TiHttpClient:    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
[ERROR] :  TiHttpClient:    at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
[ERROR] :  TiHttpClient:    at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
[ERROR] :  TiHttpClient:    at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:700)
[ERROR] :  TiHttpClient:    at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:107)
[ERROR] :  TiHttpClient:    at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
[ERROR] :  TiHttpClient:    at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73)
[ERROR] :  TiHttpClient:    at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1121)
[ERROR] :  TiHttpClient:    at android.os.Handler.dispatchMessage(Handler.java:98)
[ERROR] :  TiHttpClient:    at android.os.Looper.loop(Looper.java:146)
[ERROR] :  TiHttpClient:    at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)

问题出在onload方法的开头:Titanium.API.info("Start onload");

之后的错误returns

似乎是JSON结构的问题,但我已经尝试验证它,没问题。

index.js 中,我使用相同的模式登录,我没问题。

编辑: 我已经解决了问题...

找出不同之处:

1) 您正在发送 JSON

echo json_encode($response);

2) 代码需要 XML:

[ERROR] :  V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
[ERROR] :  XMLModule: (KrollRuntimeThread) [46894,49752] Error parsing XML
                                                                       ^^^

[ERROR] :  XMLModule: org.xml.sax.SAXParseException: Unexpected token  (position:TEXT {"regi
                          ^^^^^^^---xml parser
                                                            trying to handle JSON  ---^^^^^^

我已经解决了问题。

这不是期望 XML 的代码问题:它的输出具有误导性。

第一条消息说

[ERROR] :  V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token

在 "token" 之后有一个 space!!! 如果我在控制台中打印由 this.responseText 传递的字符串的每个字符,我可以看到两个 space:一个在开头,一个在结尾。 第一个 space 导致解析错误。第二个space无关紧要,因为它在最后。

这很奇怪,因为在其他 js index.js 中,我使用了相同的 iter,this.responseText 传递的字符串在 space 处没有开头,但结尾有两个 space。然而,最后的 spaces 是无关紧要的,所以在这种情况下,我的调用没有问题。

所以我用一个 cicle 在我的字符串中取 { 的索引,然后我在开始时使用了没有 spaces 的字符串。

createReq.onload = function() {
var response = this.responseText;
var i;
for ( i=0; i < this.responseText.length; i++) {
  if (this.responseText[i] == "{")
    break;
};

response = response.slice(i,response.length);
resultReg = JSON.parse(response);

if (resultReg.registered==false) {
// the rest of code
// .....

我选择了这个解决方案,因为 space 似乎是随便输入的。 可能是 HTTPClient 的响应管理存在一些问题。我想我也会联系 Appcelerator。

反正现在好了