2010-06-19 4 views
0

J'essaie d'extraire une valeur spécifique du contenu json. Ici, il est le lien avec le code json http://www.ebayclassifieds.com/m/AreaSearch?jsoncallback=json&lat=41.1131514&lng=-74.0437521 Comme vous pouvez voir le code affiché est php json decode - obtient une valeur

 
json({items:[{url:" http://fairfield.ebayclassifieds.com/ ",name:"Fairfield"},{url:" http://newyork.ebayclassifieds.com/ ",name:"New York City"}],error:null});
Je dois extraire le premier URL qui dans ce cas est " http://fairfield.ebayclassifieds.com/" et sa valeur de nom qui est "Fairfield", je pourrais le faire avec regex mais je préférerais utiliser json_decode. Malheureusement quand j'essaye de décoder cela ne fonctionne pas

 
$json = getContent("http://www.ebayclassifieds.com/m/AreaSearch?jsoncallback=json&lat=41.1131514&lng=-74.0437521"); 
$test = json_decode($json, true); 
+2

Le problème est, que ce n'est pas valide JSON. Les "clés" doivent également être entre guillemets (ie "{" items ": [{" url ":" http://fairfield.ebayclassifieds.com/ ", nom:" Fairfield "} ...' J'ai joué un little mais la fonction 'json_decode' génère une erreur' JSON_ERROR_SYNTAX' en raison des citations erronées. –

+0

Je viens de réaliser cela aussi, et la réponse mise à jour pour le refléter. – dmp

Répondre

0

Son JSON non valide. Les clés doivent être placées entre guillemets.

Vous pouvez valider votre fichier json en utilisant l'excellent site JSON Lint.

Ceci est une version valide des données renvoyées:

{ 
"items": [ 
    { 
     "url": "http://fairfield.ebayclassifieds.com/", 
     "name": "Fairfield" 
    }, 
    { 
     "url": "http://newyork.ebayclassifieds.com/", 
     "name": "New York City" 
    } 
], 
"error": "null" 
} 
+0

J'ai essayé $ test = '{items: [{url: "http://fairfield.ebayclassifieds.com/", nom: "Fairfield"}, {url: "http://newyork.ebayclassifieds.com/", nom: "New York City"}], erreur: null} '; $ js = json_decode ($ test, true); echo "le js est $ js"; et ne fonctionne pas non plus – Michael

+0

comment voulez-vous dire par "ne fonctionne pas"? Quelle est l'erreur? – dmp

+0

Réponse mise à jour, ce n'est pas valide, désolé :) – dmp

2

Comme danp déjà dit, le retour JSON est enfermé dans un appel de fonction (spécifiée par jsoncallback=json). Vous ne pouvez pas vous débarrasser de ce tout à fait, mais, tout en utilisant AreaSearch?jsoncallback=&lat=41.1131514&lng=-74.0437521 enlève au moins la json au début de la chaîne et vous pouvez vous débarrasser des supports par:

$json = trim(trim($json), "();"); 

avec donne:

{items:[{url:"http://fairfield.ebayclassifieds.com/",name:"Fairfield"},{url:"http://newyork.ebayclassifieds.com/",name:"New York City"}],error:null} 

Malheureusement, la chaîne JSON n'est pas valide. Les clés (items, url, ...) doivent être placées entre guillemets ". Vous pouvez facilement vérifier que vous obtenez une erreur de syntaxe avec json_last_error() (code d'erreur 4, JSON_ERROR_SYNTAX).

Mise à jour:

Selon cette question: Invalid JSON parsing using PHP, vous pouvez faire la chaîne JSON valide avec:

$json = preg_replace('/(\w+):/i', '"\1":', $json); 

Cette enserre les clés entre guillemets.


Si la chaîne serait valable, vous pouvez alors générer un tableau via:

$a = json_decode($json, true); 

qui vous donnerait:

Array 
(
    [items] => Array 
     (
      [0] => Array 
       (
        [url] => http://fairfield.ebayclassifieds.com/ 
        [name] => Fairfield 
       ) 
      [1] => Array 
       (
        [url] => http://newyork.ebayclassifieds.com/ 
        [name] => New York City 
       ) 
     ) 
    [error] => 
) 

vous pouvez donc obtenir le premier URL et nommer via $a['items'][0]['url'] et $a['items'][0]['name'] resp.


Mais je le répète, le JSON vous que la réponse est pas valide et vous ne pouvez pas analyser avec json_decode() dans sa forme originale.

+0

est-il un moyen d'utiliser le "json invalide" actuel? fondamentalement c'est comment je l'obtiens de ebayclassifieds ainsi je ne peux pas changer le chemin est montré parce que je ne possède pas le site ebayclassifieds :) – Michael

+1

@Michael: Voir ma réponse mise à jour ... –

+0

Maintenant j'ai $ test = '({items : [{url: "http://fairfield.ebayclassifieds.com/", nom: "Fairfield"}, {url: "http://newyork.ebayclassifieds.com/", nom: "New York City"}] , erreur: null}); '; $ test = trim (trim ($ test), "();"); $ test = preg_replace ('/ (\ w +):/i', '"\ 1":', $ test); $ js = json_decode ($ test, true); echo "le js est $ js"; mais ne fonctionne pas :( – Michael