Estoy tratando de analizar algunos datos JSON de la API de búsqueda de Google AJAX. yo tengo esta URL y me gustaría desglosarla para que se muestren los resultados. Actualmente he escrito este código, pero estoy bastante perdido con respecto a qué hacer a continuación, aunque hay una serie de ejemplos con cadenas JSON simplificadas.
Al ser nuevo en C # y .NET en general, he tenido problemas para obtener una salida de texto genuina para mi página ASP.NET, por lo que me han recomendado probar JSON.NET. ¿Alguien podría señalarme en la dirección correcta para simplemente escribir un código que tomará JSON de la API de búsqueda de Google AJAX e imprimirlo en la pantalla?
EDITAR: TODO FIJO! Todos los resultados están funcionando bien. Gracias de nuevo Dreas Grech!
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ServiceModel.Web;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GoogleSearchResults g1 = new GoogleSearchResults();
const string json = @"{""responseData"": {""results"":[{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://www.cheese.com/"",""url"":""http://www.cheese.com/"",""visibleUrl"":""www.cheese.com"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:bkg1gwNt8u4J:www.cheese.com"",""title"":""\u003cb\u003eCHEESE\u003c/b\u003e.COM - All about \u003cb\u003echeese\u003c/b\u003e!."",""titleNoFormatting"":""CHEESE.COM - All about cheese!."",""content"":""\u003cb\u003eCheese\u003c/b\u003e - everything you want to know about it. Search \u003cb\u003echeese\u003c/b\u003e by name, by types of milk, by textures and by countries.""},{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://en.wikipedia.org/wiki/Cheese"",""url"":""http://en.wikipedia.org/wiki/Cheese"",""visibleUrl"":""en.wikipedia.org"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:n9icdgMlCXIJ:en.wikipedia.org"",""title"":""\u003cb\u003eCheese\u003c/b\u003e - Wikipedia, the free encyclopedia"",""titleNoFormatting"":""Cheese - Wikipedia, the free encyclopedia"",""content"":""\u003cb\u003eCheese\u003c/b\u003e is a food consisting of proteins and fat from milk, usually the milk of cows, buffalo, goats, or sheep. It is produced by coagulation of the milk \u003cb\u003e...\u003c/b\u003e""},{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://www.ilovecheese.com/"",""url"":""http://www.ilovecheese.com/"",""visibleUrl"":""www.ilovecheese.com"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:GBhRR8ytMhQJ:www.ilovecheese.com"",""title"":""I Love \u003cb\u003eCheese\u003c/b\u003e!, Homepage"",""titleNoFormatting"":""I Love Cheese!, Homepage"",""content"":""The American Dairy Association\u0026#39;s official site includes recipes and information on nutrition and storage of \u003cb\u003echeese\u003c/b\u003e.""},{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://www.gnome.org/projects/cheese/"",""url"":""http://www.gnome.org/projects/cheese/"",""visibleUrl"":""www.gnome.org"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:jvfWnVcSFeQJ:www.gnome.org"",""title"":""\u003cb\u003eCheese\u003c/b\u003e"",""titleNoFormatting"":""Cheese"",""content"":""\u003cb\u003eCheese\u003c/b\u003e uses your webcam to take photos and videos, applies fancy special effects and lets you share the fun with others. It was written as part of Google\u0026#39;s \u003cb\u003e...\u003c/b\u003e""}],""cursor"":{""pages"":[{""start"":""0"",""label"":1},{""start"":""4"",""label"":2},{""start"":""8"",""label"":3},{""start"":""12"",""label"":4},{""start"":""16"",""label"":5},{""start"":""20"",""label"":6},{""start"":""24"",""label"":7},{""start"":""28"",""label"":8}],""estimatedResultCount"":""14400000"",""currentPageIndex"":0,""moreResultsUrl"":""http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den-GB\u0026q\u003dcheese""}}, ""responseDetails"": null, ""responseStatus"": 200}";
g1 = JSONHelper.Deserialise<GoogleSearchResults>(json);
Response.Write(g1.content);
}
}
public class JSONHelper
{
public static T Deserialise<T>(string json)
{
T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
DataContractJsonSerializer serialiser = new DataContractJsonSerializer(obj.GetType());
ms.Close();
return obj;
}
}
/// Deserialise from JSON
[Serializable]
public class GoogleSearchResults
{
public GoogleSearchResults() { }
public GoogleSearchResults(string _unescapedUrl, string _url, string _visibleUrl, string _cacheUrl, string _title, string _titleNoFormatting, string _content)
{
this.unescapedUrl = _unescapedUrl;
this.url = _url;
this.visibleUrl = _visibleUrl;
this.cacheUrl = _cacheUrl;
this.title = _title;
this.titleNoFormatting = _titleNoFormatting;
this.content = _content;
}
string _unescapedUrl;
string _url;
string _visibleUrl;
string _cacheUrl;
string _title;
string _titleNoFormatting;
string _content;
[DataMember]
public string unescapedUrl
{
get { return _unescapedUrl; }
set { _unescapedUrl = value; }
}
[DataMember]
public string url
{
get { return _url; }
set { _url = value; }
}
[DataMember]
public string visibleUrl
{
get { return _visibleUrl; }
set { _visibleUrl = value; }
}
[DataMember]
public string cacheUrl
{
get { return _cacheUrl; }
set { _cacheUrl = value; }
}
[DataMember]
public string title
{
get { return _title; }
set { _title = value; }
}
[DataMember]
public string titleNoFormatting
{
get { return _titleNoFormatting; }
set { _titleNoFormatting = value; }
}
[DataMember]
public string content
{
get { return _content; }
set { _content = value; }
}
}
El código actualmente se compila y se ejecuta perfectamente, pero no devuelve ningún resultado. ¿Podría alguien ayudarme a devolver lo que necesito, los resultados listos para imprimir en la pantalla?
Editar:
Json.NET funciona utilizando el mismo JSON y clases que el ejemplo anterior.
GoogleSearchResults g1 = JsonConvert.DeserializeObject<GoogleSearchResults>(json);
Enlace: serialización y deserialización de JSON con Json.NET
Relacionado
C #: análisis de datos con formato json en tablas hash anidadas
Parse JSON array
GoogleSearchResults
tipo tiene campos y propiedades que tienen el mismo nombre. Intente renombrar sus campos con guiones bajos (cualquier cosa que desambigüe entre los dos).Respuestas:
[Actualización]
Me acabo de dar cuenta de por qué no recibiste resultados ... tienes una línea faltante en tu
Deserialize
método. Olvidó asignar los resultados a suobj
:Además, solo como referencia, aquí está el
Serialize
método:Editar
Si desea usar Json.NET, aquí están los métodos Serialize / Deserialize equivalentes al código anterior.
Deserializar:
Publicar por fascículos:
Esto ya forma parte de Json.NET, por lo que puede llamarlos en la clase JsonConvert.
Enlace: serialización y deserialización de JSON con Json.NET
Ahora, la razón por la que obtienes un StackOverflow es por tu
Properties
.Tome por ejemplo este:
Tenga en cuenta que en el
getter
, está devolviendo la propiedad real (es decir, el captador de la propiedad se llama a sí mismo una y otra vez), y por lo tanto está creando una recursión infinita.Las propiedades (en 2.0) deben definirse así:
Tiene un campo privado y luego devuelve el valor de ese campo en el captador, y establece el valor de ese campo en el establecedor.
Por cierto, si está utilizando el Marco 3.5, puede hacer esto y evitar los campos de respaldo, y dejar que el compilador se encargue de eso:
fuente
DataContractJsonSerializer
solo está disponible en el marco 3.5, ¿no?Su clase de datos no coincide con el objeto JSON. Use esto en su lugar:
Además, no tiene que crear una instancia de la clase para obtener su tipo de deserialización:
fuente
Encontré este enfoque que analiza JSON en un objeto dinámico , extiende un
DynamicObject
yJavascriptConverter
convertir la cadena en un objeto.DynamicJsonObject
Convertidor
Uso ( muestra json ):
Este método tiene que devolver verdadero, de lo contrario arrojará un error. Por ejemplo, puede arrojar un error si no existe una clave.
Devolver
true
y vaciarresult
devolverá un valor vacío en lugar de arrojar un error.fuente
Solo creo que todo el ejemplo sería útil. Este es el ejemplo de este problema.
fuente
Traté de usar el código anterior pero no funcionó. La estructura JSON devuelta por Google es muy diferente y hay una falla muy importante en la función auxiliar: una llamada a
DataContractJsonSerializer.ReadObject()
eso realmente deserializa los datos JSON en el objeto.Aquí está el código que FUNCIONA en 2011:
Para obtener el contenido del primer resultado, haga:
fuente
Gracias por toda tu ayuda. Esta es mi versión final, ¡y funciona gracias a su ayuda combinada! Solo estoy mostrando los cambios que hice, todo lo demás está tomado del trabajo de Joe Chung
y
fuente
Solicite la API de Google Map y analice DirectionsResponse con C #, cambie el json en su url a xml y use el siguiente código para convertir el resultado en un Objeto de lista genérico de C # utilizable.
Me tomó un tiempo hacer. Pero aqui esta
Espero que esto ayude a alguien.
fuente