Eu tenho uma estrutura simples de php com 3 matrizes aninhadas.
Eu não uso objetos específicos e construo as matrizes com 2 loops aninhados.
Aqui está um exemplo do var_dump da matriz que desejo converter para Json.
array (size=2)
'tram B' =>
array (size=2)
0 =>
array (size=3)
'name' => string 'Ile Verte' (length=9)
'distance' => int 298
'stationID' => int 762
1 =>
array (size=3)
'name' => string 'La Tronche Hôpital' (length=18)
'distance' => int 425
'stationID' => int 771
16 =>
array (size=4)
0 =>
array (size=3)
'name' => string 'Bastille' (length=8)
'distance' => int 531
'stationID' => int 397
1 =>
array (size=3)
'name' => string 'Xavier Jouvin' (length=13)
'distance' => int 589
'stationID' => int 438
Em outro script eu tenho uma estrutura semelhante e json_encode
funciona bem. Então eu não entendo porque json_encode
não funciona aqui.
Editar: parece haver um problema com a codificação. Quando mb_detect_encoding
retorna ASCII, json_encode
funciona, mas quando retorna UTF8, não funciona mais.
Edit2: json_last_error()
retorna o JSON_ERROR_UTF8
que significa: Caracteres UTF-8 malformados, possivelmente codificados incorretamente .
This function only works with UTF-8 encoded data.
que não deve haver nenhum problema com a codificação.utf8_encode()
em seusname
campos de array antes de entregar a stringjson_encode()
.JSON_PARTIAL_OUTPUT_ON_ERROR
opção para ver o problema (por exemplo, o campo com UTF8 será nulo).Respostas:
Bem depois de 2 horas de escavação (cf. Edits)
Eu descobri a seguir:
mb_detect_encoding
retorna provavelmente uma resposta com falha, algumas strings provavelmente não eram UTF-8utf8_encode()
nessas cordas resolveu meu problema, mas veja a nota abaixoEsta é uma função recursiva que pode forçar a conversão para UTF-8 de todas as strings contidas em uma matriz:
Use-o simplesmente assim:
Nota: utf8_encode () codifica a string ISO-8859-1 para UTF-8 de acordo com os documentos, portanto, se você não tiver certeza da codificação de entrada, iconv () ou mb_convert_encoding () podem ser as melhores opções, conforme observado nos comentários e outras soluções.
fonte
} else {
para} else if (is_string ($d)) {
; caso contrário, você mudará tudo para strings (por exemplo,INT
se tornará umSTRING
).Matthieu Riegler apresentou uma solução realmente boa, mas eu tive que modificá-la ligeiramente para lidar com objetos também:
Mais uma nota: json_last_error () pode ser útil na depuração de funções json_encode () / json_encode ().
fonte
elseif
vez deelse if
? (ou seja, sem espaço em branco).if(): elseif:
else if(is_int($d)||is_bool($d)) return $d;
antes do último porque:{"success":true, "message":"Ⲃⲟⲟ𝓵ⲉⲁⲛ ⲁⲛⲇ Ⲓⲛϯⲉ𝓰ⲉꞅ𝛓"}
else
porelse if(is_string ($d))
; caso contrário, você mudará tudo para strings (por exemplo,INT
se tornará umSTRING
).Para mim, a resposta para este problema foi a configuração
charset=utf8
na minha conexão PDO.fonte
$mysqli->set_charset("utf8");
depois de fazer o manuseio do banco de dados.utf8mb4
em versões recentes do MySQL.utf8
está obsoleto.Adam Bubela também apresentou uma solução muito boa que me ajudou a resolver meu problema, e aqui está a função simplificada:
fonte
Eu tenho exatamente o mesmo problema no PHP 5.6. Eu uso Open Server + Nginx no Windows 7. Todos os conjuntos de caracteres são definidos como UTF-8. Em tese, de acordo com a documentação oficial , bandeira
deve resolver isso. Infelizmente este não é o meu caso. Eu não sei porque. Todos os snippets acima não resolvem meu problema, portanto, encontrei minha própria implementação. Eu acredito que pode ajudar alguém. Pelo menos, as letras russas passam no teste.
fonte
Esta resposta aceita funciona. Mas caso você esteja obtendo seus dados do MySQL (como eu estava), existe uma maneira mais fácil.
Depois de abrir o banco de dados, antes de consultar, você pode definir o conjunto de caracteres usando mysqli da seguinte maneira:
OU
LINK: http://php.net/manual/en/mysqli.set-charset.php
fonte
Eu encontrei esse problema em um servidor executando uma versão anterior do PHP (5.2). Eu estava usando a sinalização JSON_FORCE_OBJECT e, aparentemente, ela não é compatível até 5.3
Portanto, se você estiver usando esse sinalizador, verifique sua versão!
Uma solução alternativa parece ser apenas transmitir para um objeto antes da codificação, como:
fonte
A devolução de
mb_detect_encoding
pode não estar correta:Dependendo da ordem de detecção padrão, o acima pode retornar resultados diferentes, portanto, a codificação está sendo relatada erroneamente como UTF-8. ( Aqui está um exemplo maior .)
É provável que seus dados não estejam codificados como UTF-8, portanto,
json_encode
estão retornandofalse
. Você deve procurar converter suas strings em UTF-8 antes da codificação JSON:fonte
Estava obtendo dados de ob_get_clean () e tive o mesmo problema, mas as soluções acima não funcionam para mim. No meu caso a solução foi esta, talvez ajude alguém.
fonte
usar utf8_encode () nessa string resolveu meu problema.
fonte
Eu melhorei a resposta de Adam Bubela. Eu simplesmente odeio quando os blocos não são fechados por {e}. É mais limpo e você não introduz bugs ou talvez seja porque eu usei Perl no passado :)
fonte
Se você obtiver esses dados de um banco de dados, use
mysqli_set_charset($connection, "utf8");
em conexão ao obter os parâmetros do banco de dadosfonte
este problema surge às vezes - você não está passando o controle de acesso do cabeçalho.
No meu caso, se foi adicionado algum eco antes de json_encode. Estava mostrando resultado, caso contrário, uma página em branco estava chegando.
Eu adicionei
e meu problema resolvido.
fonte