Estou tentando analisar alguns dados JSON da API de pesquisa do Google AJAX. Eu tenho esse URL e gostaria de detalhá-lo para que os resultados sejam exibidos. No momento, escrevi esse código, mas estou bastante perdido em relação ao que fazer a seguir, embora haja vários exemplos por aí com seqüências JSON simplificadas.
Sendo novo em C # e .NET em geral, lutei para obter uma saída de texto genuína para minha página ASP.NET, por isso me foi recomendado dar uma chance ao JSON.NET. Alguém poderia me apontar na direção certa para simplesmente escrever algum código que receba JSON da API de pesquisa do Google AJAX e imprimi-lo na tela?
EDIT: TODO CORRIGIDO! Todos os resultados estão funcionando bem. Mais uma vez obrigado 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; }
}
}
O código atualmente compila e executa perfeitamente, mas não está retornando nenhum resultado. Alguém poderia me ajudar a devolver o que eu preciso, com os resultados prontos para imprimir na tela?
Editar:
O Json.NET funciona usando o mesmo JSON e classes do exemplo acima.
GoogleSearchResults g1 = JsonConvert.DeserializeObject<GoogleSearchResults>(json);
Link: Serializando e desserializando JSON com Json.NET
Relacionado
Analisar dados formatados json em hashtables aninhadas
Parse JSON array
GoogleSearchResults
tipo possui campos e propriedades com o mesmo nome. Tente renomear seus campos com sublinhados à esquerda (qualquer coisa que não tenha ambiguidade entre os dois).Respostas:
[Update]
Acabei de perceber por que você não estava recebendo resultados de volta ... você tem uma linha ausente no seu
Deserialize
método. Você estava esquecendo de atribuir os resultados ao seuobj
:Além disso, apenas para referência, aqui está o
Serialize
método:Editar
Se você deseja usar o Json.NET, aqui estão os métodos Serialize / Deserialize equivalentes ao código acima.
Desserializar:
Serializar:
Isso já faz parte do Json.NET, portanto você pode chamá-los na classe JsonConvert.
Link: Serializando e desserializando JSON com Json.NET
Agora, o motivo pelo qual você está recebendo um StackOverflow é por causa do seu
Properties
.Tomemos, por exemplo, este:
Observe que no
getter
, você está retornando a propriedade real (ou seja, o getter da propriedade está se chamando repetidamente) e, portanto, está criando uma recursão infinita.As propriedades (na versão 2.0) devem ser definidas da seguinte maneira:
Você tem um campo privado e, em seguida, retorna o valor desse campo no getter e define o valor desse campo no setter.
Btw, se você estiver usando o 3.5 Framework, você pode fazer isso e evitar os campos de suporte, e deixar o compilador cuidar disso:
fonte
DataContractJsonSerializer
está disponível apenas na estrutura 3.5, não?Sua classe de dados não corresponde ao objeto JSON. Use isso:
Além disso, você não precisa instanciar a classe para obter seu tipo de desserialização:
fonte
Eu encontrei essa abordagem que analisa JSON em um objeto dinâmico , estende um
DynamicObject
eJavascriptConverter
para transformar a string em um objeto.DynamicJsonObject
Conversor
Uso ( amostra json ):
Este método deve retornar true, caso contrário, gerará um erro. Por exemplo, você pode gerar um erro se uma chave não existir.
Retornar
true
e esvaziarresult
retornará um valor vazio em vez de gerar um erro.fonte
Eu apenas acho que todo o exemplo seria útil. Este é o exemplo para esse problema.
fonte
Tentei usar o código acima, mas não funcionou. A estrutura JSON retornada pelo Google é muito diferente e há uma falta muito importante na função auxiliar: uma chamada para
DataContractJsonSerializer.ReadObject()
isso realmente desserializa os dados JSON no objeto.Aqui está o código que FUNCIONA em 2011:
Para obter o conteúdo do primeiro resultado, faça:
fonte
Obrigado a todos por sua ajuda. Esta é a minha versão final e funciona graças à sua ajuda combinada! Estou apenas mostrando as alterações que fiz, todo o resto foi retirado do trabalho de Joe Chung
e
fonte
Solicite a API do Google Map e analise DirectionsResponse com C #, altere o json no seu URL para xml e use o código a seguir para transformar o resultado em um Objeto de lista genérica utilizável em C #.
Levei um tempo para fazer. Mas aqui está
Espero que isso ajude alguém.
fonte