生成格式错误的JSON

时间:2015-10-16 17:22:44

标签: php jquery json ajax

我使用php开发数据库搜索应用程序,并在一个页面上通过Jquery Ajax(JSON)根据某个参数搜索数据库中的寄存器,向服务器端脚本发出请求。搜索成功后,我回显一个关联数组,其中所有条目都被编码为JSON。

使用Chrome的元素检查器,我可以阅读响应,如下所示:

[0: False
1: "{"id":"5","nome":"Maria","sobrenome":"Joaquina","sexo":"F","rua":"","complemento":"","numero":"0","bairro":"Aeroporto\r\n","telefone":"","email":"","nacionalidade":"Peruano"}"]

索引为1的元素似乎是一个格式良好的JSON,但我无法从中读取,例如data [1] .nome返回undefined。

我想知道我的json发生了什么,我该如何解决它,以便我可以通过它们的属性访问对象。下面是处理JSON的代码。

使用Javascript:

$(document).ready(function(){
$('#btnEnviarBairro').click(function(){
    var data = $("#bairros_juizdefora").val();
    $.ajax({
        type: "POST",
        url: "processaBuscaId.php",
        dataType: 'json',
        data: {id : data, type: 1},
        success: function(response){
            var table = $('<table/>');
            for ( var i = 1; i < response.length; i++){
                table.append("<tr><td>"+response[i].nome+"</tr></td>");
            }
            $('#receptorBairro').append(table);

        },
        error: function(xhr, status, error){
            console.log(xhr+" "+status+" "+error);
        }
    }).done(function(){

    });
});});

控制器文件种类:

function buscaBairro($id, $connection) {
   $dao = new estrangeiroDao ( $connection );
   return $dao->selectbyBairroId ( $id );
};
echo json_encode (buscaBairro($selectId, $connection));

DAO搜索:

function selectbyBairroId($id) {
    $sql = 'select * from dados_estrangeiro, nacionalidade, bairros_juizdefora where bairroid = '.$id.' and idnac=idnacionalidade and idbairros_juizdefora = '.$id;
    $arres = array ();
    $result = $this->con->query ( $sql );
    while ( $obj = $result->fetch_object () ) {
        $estrangeiro = $this->objectToEstrangeiro ( $obj );
        array_push ( $arres, json_encode($estrangeiro->returnAsAssoc()) );
    }
    return $arres;

}
}

ObjectToEstrangeiro方法(上面使用):

function objectToEstrangeiro($obj) {
    $est = new estrangeiros ( $obj->idestrangeiro, $obj->pnome, $obj->snome, $obj->sexo, $obj->rua, $obj->complemento, $obj->numero, utf8_encode ( $obj->nomebairros_juizdefora ), $obj->telefone, $obj->email, utf8_encode ( $obj->nomenacionalidade ) );
    return $est;
}

&#34;豆&#34; (我知道这是java的东西,但我学习并尝试在PHP中实现)用于Estrangeiro表:

class estrangeiros {
[...]
[... Attributes and Getters and Setters (I dont know if they are usfull in PHP...]
[...]
    public function returnAsAssoc(){
        $arres= array("id"=>$this->getId(), "nome" => $this->getNome(), "sobrenome"=>$this->getSobrenome(), "sexo"=>$this->getSexo(),
                "rua"=>$this->getRua(), "complemento"=>$this->getComplemento(), "numero"=>$this->getNumero(), "bairro"=>$this->getBairro(),
                "telefone" =>$this->getTelefone(), "email"=> $this->getEmail(), "nacionalidade"=>$this->getNacionalidade()
        );

        return $arres;
    }
}

修改

从评论中我可以看到JSON的回复是错误的,但现在我试图找出原因。

以下是我发现的一些事情:

我将一个json编码的关联数组数组传递给控制器​​,在那里它再次进行json编码和回显。 如果删除任何json编码,我在Jquery中没有得到任何响应。

另外,我无法对对象数组进行编码(至少不使用私有属性)?因此,我必须将我提取的对象转换为关联数组,然后将它们存储在另一个数组中,以便我可以访问它们的值。

3 个答案:

答案 0 :(得分:1)

我认为这可能是你的理由。

您正在将数据收集函数selectbyBairroId中的每个数据项转换为JSON,然后返回该数组并再次将其转换为JSON。

您应该只执行一次,在完全PHP数据结构中构建数据,然后,在将其发送回之前,将其全部转换为JSON。

function selectbyBairroId($id) {
    $sql = 'select * from dados_estrangeiro, 
                          nacionalidade, 
                          bairros_juizdefora 
            where bairroid = '.$id.' 
              and idnac=idnacionalidade 
              and idbairros_juizdefora = '.$id;

    $arres = array ();

    $result = $this->con->query ( $sql );

    while ( $obj = $result->fetch_object () ) {
        $estrangeiro = $this->objectToEstrangeiro ( $obj );

        //array_push ($arres, json_encode($estrangeiro->returnAsAssoc()));

        $arres[] = $estrangeiro->returnAsAssoc();
    }
    return $arres;
}


function buscaBairro($id, $connection) {
    $dao = new estrangeiroDao ( $connection );
    return $dao->selectbyBairroId ( $id );
};

echo json_encode (buscaBairro($selectId, $connection));

在您的问题中发表此评论之后:

另外,我无法对对象数组进行编码(至少不使用私有属性)?因此,我必须将我提取的对象转换为关联数组,然后将它们存储在另一个数组中,以便我可以访问它们的值。

是的,你可以编码一个对象数组。 ->fetch_object()返回的对象位于stdClass()定义的对象中,因此所有属性都是公共的。

请尝试使用此简化的selectbyBairroId函数

function selectbyBairroId($id) {
    $sql = 'select * from dados_estrangeiro, 
                          nacionalidade, 
                          bairros_juizdefora 
            where bairroid = '.$id.' 
              and idnac=idnacionalidade 
              and idbairros_juizdefora = '.$id;

    $arres = array ();

    $result = $this->con->query ( $sql );

    while ( $obj = $result->fetch_object () ) {
         $arres[] = $obj;
    }
    return $arres;
}

并且您应该拥有一个对象数组,其中包含查询定义的结果集的属性。

答案 1 :(得分:0)

它无效JSON,必须是:

[0: "False", 1: "{"id":"5","nome":"Maria","sobrenome":"Joaquina","sexo":"F","rua":"","complemento":"","numero":"0","bairro":"Aeroporto\r\n","telefone":"","email":"","nacionalidade":"Peruano"}"]

答案 2 :(得分:0)

经过一番摆弄,我发现了错误。它是在utf-8中包含存储在DB中的数据。修复之后,不再有JSON错误。

永远记得在你的JSON上使用UTF-8!