Estou tendo um problema com a função json_encode do PHP. Codifica números como strings, por exemplo
array('id' => 3)
torna-se
"{ ["id": "3", ...)
Quando js encontra esses valores, ele os interpreta como seqüências de caracteres e operações numéricas falham neles. Alguém sabe alguma maneira de impedir a json_encode
codificação de números como seqüências de caracteres? Obrigado!
php
javascript
json
Chris Barnhill
fonte
fonte
Respostas:
Eu fiz um teste muito rápido:
Parece ser o que você descreve, se não me engano?
E eu estou recebendo como saída:
Portanto, nesse caso, os números inteiros não foram convertidos em string.
Ainda assim, isso pode ser dependente da versão do PHP que estamos usando: houve alguns bugs relacionados ao json_encode corrigidos, dependendo da versão do PHP ...
Este teste foi feito com o PHP 5.2.6; Estou recebendo a mesma coisa com o PHP 5.2.9 e 5.3.0; Eu não tenho outra versão 5.2.x para testar, no entanto :-(
Qual versão do PHP você está usando? Ou seu caso de teste é mais complexo que o exemplo que você postou?
Talvez um relatório de erro em http://bugs.php.net/ possa estar relacionado? Por exemplo, Bug # 40503: a conversão de número inteiro json_encode é inconsistente com o PHP ?
Talvez o bug # 38680 também pudesse interessá-lo, btw?
fonte
Note que desde o PHP 5.3.3, há uma flag para números de conversão automática (o parâmetro options foi adicionado no PHP 5.3.0):
fonte
JSON_NUMERIC_CHECK
tenta adivinhar automaticamente se uma sequência é um número ou não, tentando analisá-la. Isso é muito pouco confiável se você pensar sobre isso. Ele converterá todas as propriedades de aparência numérica em números (não apenas aquelas que você deseja) e fará isso apenas se parecerem com números. Isso é pelo menos instável, se não inseguro. O código que consome o JSON produzido pode depender do tipo que é um ou outro. Coisas estranhas podem acontecer se essas expectativas não forem atendidas. Se você se preocupa com boas práticas e segurança, deve converter seletivamente os valores que deseja.Eu também estava lendo um banco de dados (PostgreSQL) e tudo era uma string. Passamos por cada linha e fazemos as coisas para criar nossa matriz de resultados finais, então eu usei
dentro do loop para forçá-lo a ser um valor inteiro. Quando o faço
json_encode($result_arr)
agora, ele o formata corretamente como um número. Isso permite que você controle o que é e o que não é um número proveniente do seu banco de dados.EDITAR:
A
json_encode()
função também tem a capacidade de fazer isso rapidamente, usando aJSON_NUMERIC_CHECK
bandeira como um segundo argumento para ela. Você precisa ter cuidado ao usá-lo, conforme mostrado neste exemplo de usuário na documentação (copiada abaixo): http://uk3.php.net/manual/en/function.json-encode.php#106641E então você obtém esse JSON:
fonte
json_encode
função. esta é a resposta mais correta, mas tenha cuidado, poisJSON_NUMERIC_CHECK
converte também números de telefone e outros valores de sequência numérica, e isso pode causar problemas nos zeros à esquerda ou '+' ... Sugiro corrigir esse problema na função de leitura do banco de dados.experimentar
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
Mas apenas funciona no PHP 5.3.3. Veja este log de alterações do PHP json_encode http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
fonte
Estou com o mesmo problema (PHP-5.2.11 / Windows). Estou usando esta solução alternativa
que substitui todos os números (não negativos, inteiros) entre aspas pelo próprio número ('"42"' se torna '42').
Veja também este comentário no manual do PHP .
fonte
$json_array = json_encode($some_array, false);
Portanto, o argumento false diz ao PHP para não fazer a conversão do objeto.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
O teste a seguir confirma que alterar o tipo para string faz com que json_encode () retorne um numérico como uma string JSON (ou seja, entre aspas duplas). Use settype (arr ["var"], "número inteiro") ou settype ($ arr ["var"], "float") para corrigi-lo.
fonte
Por uma questão de integridade (como ainda não posso adicionar comentários), deixe-me também adicionar esse detalhe como outra resposta:
(Editar: para ser lido depois de perceber que os dados de origem (por exemplo, no caso do OP, conjunto de resultados do banco de dados) podem ser o problema (retornando colunas numéricas como seqüências de caracteres) e json_encode () na verdade não era a origem do problema)
Páginas de manual de ambos " mysql_fetch_array ":
... e " mysql_ fetch_ row ":
afirma claramente isso; as entradas na matriz retornada serão cadeias de caracteres.
(Eu estava usando a classe DB no phpBB2 (sim, eu sei, é obsoleto!), E o método "sql_fetchrow ()" dessa classe usa "mysql_fetch_array ()")
Não percebendo isso, acabei encontrando essa pergunta e entendendo o problema! :)
Como Pascal Martin afirmou acima em seus comentários de acompanhamento, acredito que uma solução que cuida do problema do "tipo incorreto" na fonte (ou seja, usando a função " mysql_field_type () " e fazendo a conversão logo após a busca, (ou outros métodos de busca como "objeto"?)) seriam os melhores em geral.
fonte
Então Pascal MARTIN não está recebendo crédito suficiente aqui. A verificação de valores numéricos em cada retorno JSON não é viável para um projeto existente com centenas de funções do lado do servidor.
Substituí o php-mysql pelo php-mysqlnd e o problema desapareceu. Números são números, strings são strings, booleanos são booleanos.
fonte
Eu também tive o mesmo problema ao processar dados do banco de dados. Basicamente, o problema é que o tipo na matriz a ser convertida em json é reconhecido pelo PHP como uma string e não como um número inteiro. No meu caso, fiz uma consulta que retorna dados de uma linha de contagem de colunas do banco de dados. O driver PDO não reconhece a coluna como int, mas como seqüências de caracteres. Resolvi realizando uma conversão como int na coluna afetada.
fonte
fonte
é a versão php o problema, tive o mesmo problema atualizei minha versão php para 5.6 resolvi o problema
fonte
A conversão dos valores para um int ou float parece corrigi-lo. Por exemplo:
fonte
Você pode usar (int) se ocorrer algum problema! Vai funcionar bem.
fonte
Apenas execute o mesmo problema e o banco de dados retornará os valores como seqüências de caracteres.
Eu uso isso como uma solução alternativa:
Isso é multiplicar o valor por 1 para convertê-lo em um número
Espero que ajude alguém
fonte
json_encode serializa algumas estruturas de dados no formato JSON para serem enviadas pela rede. Portanto, todo o conteúdo será do tipo string. Assim como quando você recebe algum parâmetro de $ _POST ou $ _GET.
Se você precisar fazer operações numéricas nos valores enviados, apenas converta-os para int primeiro (com a função intval () em PHP ou parseInt () em Javascript) e, em seguida, execute as operações.
fonte
Bem, o PHP json_encode () retorna uma string.
Você pode usar parseFloat () ou parseInt () no código js:
fonte
Como oli_arborum disse, acho que você pode usar um
preg_replace
para fazer o trabalho. Apenas mude o comando assim:fonte