Tenho este objeto JSON armazenado em um arquivo de texto simples:
{
"MySQL": {
"Server": "(server)",
"Username": "(user)",
"Password": "(pwd)",
"DatabaseName": "(dbname)"
},
"Ftp": {
"Server": "(server)",
"Username": "(user)",
"Password": "(pwd)",
"RootFolder": "(rf)"
},
"BasePath": "../../bin/",
"NotesAppPath": "notas",
"SearchAppPath": "buscar",
"BaseUrl": "http:\/\/montemaiztusitio.com.ar",
"InitialExtensions": [
"nem.mysqlhandler",
"nem.string",
"nem.colour",
"nem.filesystem",
"nem.rss",
"nem.date",
"nem.template",
"nem.media",
"nem.measuring",
"nem.weather",
"nem.currency"
],
"MediaPath": "media",
"MediaGalleriesTable": "journal_media_galleries",
"MediaTable": "journal_media",
"Journal": {
"AllowedAdFileFormats": [
"flv:1",
"jpg:2",
"gif:3",
"png:4",
"swf:5"
],
"AdColumnId": "3",
"RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
"FrontendLayout": "Flat",
"AdPath": "ad",
"SiteTitle": "Monte Maíz: Tu Sitio",
"GlobalSiteDescription": "Periódico local de Monte Maíz.",
"MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
"TemplatePath": "templates",
"WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
"WeatherMeasureType": "1",
"CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
"TimesSingular": "vez",
"TimesPlural": "veces"
}
}
Quando tento decodificá-lo com json_decode()
, ele retorna NULL. Por quê? O arquivo é legível (tentei ecoar file_get_contents()
e funcionou bem).
Eu testei o JSON em http://jsonlint.com/ e é perfeitamente válido.
O que há de errado aqui?
Solução
Procurando respostas no Google, voltei ao SO: json_decode retorna NULL após chamada de serviço da web . Meu arquivo JSON tinha a sequência UTF BOM (alguns caracteres binários que não deveriam estar lá), quebrando assim a estrutura JSON. Foi ao Editor Hex, apagou os bytes. Tudo voltou ao normal. Por que isso aconteceu? Porque editei o arquivo usando o Bloco de notas do Microsoft Windows. Idéia terrível!
json_last_error()
.Respostas:
Pode ser a codificação dos caracteres especiais. Você pode pedir a json_last_error () para obter informações definitivas.
fonte
json_last_error()
porque é o PHP 5.2.9. Essa função aparece no PHP 5.3.0.utf8_decode()
primeiro, entãojson_decode()
falhará silenciosamente.Isso funcionou para mim
fonte
Você pode tentar com isso.
fonte
stripslashes()
duas vezes, o que removeu barras essenciais e causou uma string JSON inválida. Essa resposta me ajudou a identificar o erroSe você verificar a solicitação no cromo, verá que o JSON é texto, portanto, foi adicionado um código em branco ao JSON.
Você pode limpá-lo usando
$k=preg_replace('/\s+/', '',$k);
Então você pode usar:
json_decode($k)
print_r
irá então mostrar a matriz.fonte
$k=preg_replace('/\s+/', ' ',$k);
Eu tive o mesmo problema e o resolvi simplesmente substituindo o caractere de aspas antes de decodificar.
Meu valor JSON foi gerado pela função JSON.stringify.
fonte
Talvez alguns personagens ocultos estejam bagunçando seu json, tente isto:
fonte
fez isso por mim. E sim, testando no Chrome. Obrigado ao usuário2254008
fonte
Só pensei em acrescentar isso, pois me deparei com esse problema hoje. Se houver qualquer preenchimento de string em torno de sua string JSON, json_decode retornará NULL.
Se você estiver extraindo o JSON de uma fonte diferente de uma variável PHP, seria aconselhável "cortá-lo" primeiro:
fonte
isso ajuda você a entender qual é o tipo de erro
fonte
Apenas salve uma vez. Passei 3 horas para descobrir que era apenas um problema de codificação de html. Tente isto
fonte
Conforme declarado por Jürgen Math, o uso do método preg_replace listado pelo usuário2254008 corrigiu para mim também.
Isso não se limita ao Chrome, parece ser um problema de conversão de conjunto de caracteres (pelo menos no meu caso, Unicode -> UTF8). Isso corrigiu todos os problemas que eu estava tendo.
Como um nó futuro, o objeto JSON que estava decodificando veio da função json.dumps do Python. Isso, por sua vez, fez com que alguns outros dados não higiênicos fossem transmitidos, embora fosse fácil de lidar.
fonte
Se você estiver obtendo json do banco de dados, coloque
depois de definir o link de conexão $ con
fonte
Aqui você pode encontrar um pequeno wrapper JSON com ações corretivas que abordam problemas de BOM e não ASCI: https://stackoverflow.com/a/43694325/2254935
fonte
No meu caso, é por causa da aspa simples na string JSON.
O formato JSON aceita apenas aspas duplas para chaves e valores de string.
Exemplo:
Eu fiquei confuso por causa da sintaxe Javascript. Em Javascript, é claro, podemos fazer assim:
mas mais tarde, ao converter esses objetos em string JSON:
fonte
Resolvi esse problema imprimindo o JSON e verificando a origem da página (CTRL / CMD + U):
Descobriu-se que havia uma
<pre>
etiqueta à direita .fonte
você deve garantir esses pontos
1. sua string json não tem caracteres desconhecidos
2. json string pode ser visualizado no visualizador json on-line (você pode pesquisar no google como visualizador on-line ou analisador de json), ele deve ser visualizado sem nenhum erro
3. sua string não tem entidades html, ela deve ser texto / string simples
para explicação do ponto 3
para (remover função htmlentities ())
fonte
Para mim, eu tive que desligar o error_reporting , para fazer o json_decode () funcionar corretamente. Parece estranho, mas é verdade no meu caso. Porque há algum aviso impresso entre a string JSON que estou tentando decodificar.
fonte
A coisa mais importante a lembrar, ao obter um resultado NULL de dados JSON válido, é usar o seguinte comando:
Ou seja,
Você então corrige isso com:
fonte
Então, html_entity_decode () funcionou para mim. Por favor, tente isso.
fonte
fonte