jQuery JSON Analyser - Jeton Inattendu Erreur
Je suis en train d'utiliser Envato API afin de recueillir de l'utilisateur stats w/jQuery. Je vais vous montrer un exemple de réponse JSON:
{
"new-files-from-user":[
{
"thumbnail":"http://3.s3.envato.com/files/60560.jpg",
"tags":"",
"user":"collis",
"url":"http://themeforest.net/item/manilla-photoshop-design/22803",
"live_preview_url":"http://2.s3.envato.com/files/60561/1_Home.__large_preview.jpg",
"uploaded_on":"Wed Dec 03 03:32:35 +1100 2008",
"cost":"10.00",
"item":"Manilla Photoshop Design",
"sales":"294",
"rating":"4",
"id":"22803"
},
{
"thumbnail":"http://2.s3.envato.com/files/60223.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/black-white-simple-theme/22705",
"live_preview_url":"http://0.s3.envato.com/files/60224/1_home.__large_preview.jpg",
"uploaded_on":"Tue Dec 02 04:01:12 +1100 2008",
"cost":"8.00","item":"Black + White Simple Theme",
"sales":"272","
rating":"4",
"id":"22705"
},
{
"thumbnail":"http://1.s3.envato.com/files/44556.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/quik-v1-admin-skin/17314",
"live_preview_url":"http://3.s3.envato.com/files/44557/1_green.__large_preview.jpg",
"uploaded_on":"Fri Sep 05 07:30:24 +1000 2008","cost":"12.00",
"item":"Quik v1 Admin Skin",
"sales":"336",
"rating":"5",
"id":"17314"
},
{"thumbnail":"http://3.s3.envato.com/files/45212.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/freshcorp-business-template/17528",
"live_preview_url":"http://3.s3.envato.com/files/45213/1_Homepage.__large_preview.jpg",
"uploaded_on":"Tue Sep 09 06:10:50 +1000 2008",
"cost":"20.00",
"item":"FreshCorp - Business Template",
"sales":"277",
"rating":"4","id":"17528"
},
{"thumbnail":"http://0.s3.envato.com/files/45739.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/real-estate-html-template/17732",
"live_preview_url":"http://0.s3.envato.com/files/45740/1_homepage.__large_preview.jpg",
"uploaded_on":"Fri Sep 12 14:22:45 +1000 2008",
"cost":"20.00","item":"Real Estate HTML Template",
"sales":"175",
"rating":"4",
"id":"17732"
}
]
}
Voici mon script:
<script type="text/javascript">
//this gets JSON data from an url
$.getJSON("http://marketplace.envato.com/api/edge/new-files-from-user:collins,themeforest.json?callback=?",
//this function gets called when data has been recieved
function(data){
//parsing JSON data, line by line(like foreach)
$.each(data['new-items-from-user'], function(i,item){
//puts all titles in our div
$("#test").append(item.item+"<br />");
});
});
</script>
<div id="test"></div>
Et voici ce que j'obtiens dans le Chrome console: "Uncaught SyntaxError: Unexpected Token :' (pic http://imgur.com/8qoqO).
Je ne suis pas sûr si j'ai une erreur dans mon code qui est à l'origine de ce problème, mais voici un violon pour voir le résultat: http://jsfiddle.net/wkmDj/
Grâce,
Matt
- le
:
dans l'url provoque l'erreur, soit parce que jQuery analyse et ne l'aime pas ou le XHR objet lui-même ne l'aime pas. - Est-il une solution pour cela? Pensez-vous l'encodage de l'URL serait le résoudre?
- Edit: sur la console Chromée il dit que c'est l'obtention de l'erreur à partir du flux JSON, je vais mettre à jour mon post avec un pic
- Pas sûr si cela est pertinent: mon safari client se plaint du fait que la ressource est envoyé avec le type MIME application/octet-stream. Qui n'est pas bonne, n'est ce pas?
- Je pense que le point d'interrogation à la fin de votre URL est un problème. Les modifications message d'erreur si vous le déposez.
- -Les étés, le "octet-stream" fait partie d'un .htaccess modification qui permet de s'assurer que votre ordinateur télécharge le flux JSON au lieu de l'afficher dans votre navigateur. -Seth, le point d'interrogation est nécessaire (une partie de rappel), de sorte que le JSON peut être consulté par jQuery, sinon vous obtiendrez d'Origine fiddle.jshell.net n'est pas autorisé par Access-Control-Allow-Origin.'
- Essayez encodage du côlon et du dernier point d'interrogation, voir si cela fonctionne.
- Les gars, il charge le JSON amende, c'est le côlon à l'intérieur de la réponse JSON qui est à l'origine du problème jsfiddle.net/AWq7D/1
- c'est parce que le raw JSON est interprétée par le parser JavaScript tel qu'il est - il n'y a pas de fonction de rappel. En d'autres termes, le JSONP réponse est de retour sans l'appel de la fonction enroulé autour des données JSON.
- J'ai mis à jour ma réponse.
Vous devez vous connecter pour publier un commentaire.
Dans le deuxième objet dans la liste de la réponse JSON, il y a un saut de ligne dans le milieu d'un nom de propriété:
Peut-être que c'est juste une erreur de transcription.
modifier — OK c'était une erreur de transcription. Je pense que le problème est que le site web vous parlez n'a pas vraiment comprendre JSONP correctement. C'est le retour JSON qui a l'air bien, mais JSONP exige que le JSON être retourné enveloppé dans un appel de fonction. En d'autres termes, la réponse devrait ressembler à:
Ce n'est pas faire ça, donc quand le JSON est évaluée par lui-même, il constitue une erreur de syntaxe car JavaScript pense qu'à la tête de
{
est le début d'une code bloc, pas un objet littéral.À la recherche, à la documentation de l'API, je ne vois rien à suggérer qu'il est destiné à être utilisé comme un JSONP service. On dirait qu'ils ont l'intention qu'il soit utilisé de quelque chose comme une application du téléphone ou à partir d'un serveur web ou quelque chose comme ça, mais pas de JavaScript dans le navigateur via JSONP.
Un éventuel problème, le code a:
Mais les données ressemble à ceci:
Comme @Pointu dit, la réponse n'est pas analysée comme json, mais en tant que script. Donc
eval
la fonction est exécutée.et c'est de donner à l'erreur.
Dans le cas de jsonp si l'url est http://marketplace.envato.com/api/edge/new-files-from-user:mechabyte,themeforest.json, l'appel doit être fait comme
et la réponse devrait être
et si vous avez une fonction
mycallback
travaillera
ou si vous ne définissez pas un rappel
la réponse doit être
puis
travaillera
Dans votre cas, vous pouvez voir que chaque fois que jQuery est le paramètre
callback
commedonc la réponse doit être
e.g: https://twitter.com/statuses/user_timeline/tomhanks.json?callback=myCallback&count=5
Mais comme la réponse est une chaîne json cela fonctionne. (soumis à la même règle d'origine)