javascript - example - parse json jquery
jQuery.ajax() parsererror (3)
En caso de que el servidor no admita la solicitud de cross domain
, puede:
- crear un proxy del lado del servidor
- realice una solicitud ajax a su proxy, que a su vez obtendrá
json
del servicio, y - Devuelve la respuesta y luego podrás manipularla ...
en php puedes hacerlo así
proxy.php contiene el siguiente código
<?php
if(isset($_POST[''geturl'']) and !empty($_POST[''geturl''])) {
$data = file_get_contents($_POST[''geturl'']);
print $data;
}
?>
y haces la solicitud ajax para tu proxy como este
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
alert("abt to do ajax");
$.ajax({
url:''proxy.php'',
type:"POST",
data:{geturl:''http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json''},
success:function(data){
alert("success");
alert(data);
}
});
});
});
</script>
probado y probado obtengo la respuesta de json de nuevo ...
cuando intento obtener JSON de http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json con:
(jQuery 1.6.2)
$.ajax({
type: "GET",
url: url,
dataType: "jsonp",
success: function (result) {
alert("SUCCESS!!!");
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.statusText);
alert(xhr.responseText);
alert(xhr.status);
alert(thrownError);
}
});
Me sale: parsererror; 200; undefined; jquery162******************** was not called
parsererror; 200; undefined; jquery162******************** was not called
pero con el JSON de http://search.twitter.com/search.json?q=beethoven&callback=?&count=5 funciona bien. Ambos son formatos JSON válidos. Entonces, ¿de qué se trata este error?
[ACTUALIZAR]
@ 3ngima, lo he implementado en asp.net, funciona bien:
$.ajax({
type: "POST",
url: "WebService.asmx/GetTestData",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
alert(result.d);
}
});
WebService.asmx:
[WebMethod]
public string GetTestData()
{
try
{
var req = System.Net.HttpWebRequest.Create("http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json");
using (var resp = req.GetResponse())
using (var stream = resp.GetResponseStream())
using (var reader = new System.IO.StreamReader(stream))
return reader.ReadToEnd();
}
catch (Exception) { return null; }
}
Es porque le está diciendo a jQuery que está esperando que JSON-P , no JSON , regrese. Pero el regreso es JSON. JSON-P está horriblemente mal llamado, nombrado de una manera que no causa un final de confusión. Es una convención para transmitir datos a una función a través de una etiqueta de script
. En contraste, JSON es un formato de datos.
Ejemplo de JSON:
{"foo": "bar"}
Ejemplo de JSON-P:
yourCallback({"foo": "bar"});
JSON-P funciona porque JSON es un subconjunto de notación literal de JavaScript. JSON-P no es más que una promesa de que si le dice al servicio que está llamando a qué nombre de función devolver (en general, colocando un parámetro de callback
en la solicitud), la respuesta será en forma de nombre de functionname(data)
, donde los data
serán "JSON" (o más a menudo, un literal de JavaScript, que puede no ser exactamente lo mismo). Se supone que debe usar una URL JSON-P en el src
una etiqueta de script
(que jQuery hace por usted), para evitar la Política del mismo origen que evita que las solicitudes de ajax soliciten datos de orígenes distintos al documento en el que se originan (a menos que el servidor soporta CORS y su navegador también lo hace).
Por fin he encontrado la solución. En primer lugar, los métodos web en un servicio web o página no funcionan para mí, siempre devuelve xml, en trabajos locales bien, pero en un proveedor de servicios como Godaddy no lo hace.
Mi solución fue crear un .ahsx
, un controlador en .net y envolver el contenido con la función de devolución de llamada jquery que pasa el jsonp, y funciona.
[System.Web.Script.Services.ScriptService]
public class HandlerExterno : IHttpHandler
{
string respuesta = string.Empty;
public void ProcessRequest ( HttpContext context )
{
string calls= context.Request.QueryString["callback"].ToString();
respuesta = ObtenerRespuesta();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Write( calls +"("+ respuesta +")");
}
public bool IsReusable
{
get
{
return false;
}
}
[System.Web.Services.WebMethod]
private string ObtenerRespuesta ()
{
System.Web.Script.Serialization.JavaScriptSerializer j = new System.Web.Script.Serialization.JavaScriptSerializer();
Employee[] e = new Employee[2];
e[0] = new Employee();
e[0].Name = "Ajay Singh";
e[0].Company = "Birlasoft Ltd.";
e[0].Address = "LosAngeles California";
e[0].Phone = "1204675";
e[0].Country = "US";
e[1] = new Employee();
e[1].Name = "Ajay Singh";
e[1].Company = "Birlasoft Ltd.";
e[1].Address = "D-195 Sector Noida";
e[1].Phone = "1204675";
e[1].Country = "India";
respuesta = j.Serialize(e).ToString();
return respuesta;
}
}//class
public class Employee
{
public string Name
{
get;
set;
}
public string Company
{
get;
set;
}
public string Address
{
get;
set;
}
public string Phone
{
get;
set;
}
public string Country
{
get;
set;
}
}
Y aquí está la llamada con jQuery:
$(document).ready(function () {
$.ajax({
// url: "http://www.wookmark.com/api/json",
url: ''http://www.gjgsoftware.com/handlerexterno.ashx'',
dataType: "jsonp",
success: function (data) {
alert(data[0].Name);
},
error: function (data, status, errorThrown) {
$(''p'').html(status + ">> " + errorThrown);
}
});
});
y funciona perfectamente
Gabriel