Próbuję przeanalizować niektóre dane JSON z interfejsu API Google AJAX Search. Mam ten adres URL i chciałbym go podzielić, aby wyświetlić wyniki. Obecnie napisałem ten kod, ale jestem całkiem zagubiony w kwestii tego, co robić dalej, chociaż istnieje wiele przykładów z uproszczonymi ciągami JSON.
Będąc nowym w C # i .NET ogólnie starałem się uzyskać prawdziwy tekst wyjściowy dla mojej strony ASP.NET, więc polecono mi wypróbowanie JSON.NET. Czy ktoś mógłby skierować mnie w dobrym kierunku, aby po prostu napisać kod, który pobierze JSON z Google AJAX Search API i wydrukuje go na ekranie?
EDYCJA: WSZYSTKIE NAPRAWIONE! Wszystkie wyniki działają dobrze. Jeszcze raz dziękuję 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; }
}
}
Obecnie kod kompiluje się i działa idealnie, ale nie zwraca żadnych wyników. Czy ktoś może mi pomóc w zwróceniu tego, czego potrzebuję, a wyniki są gotowe do wydrukowania na ekranie?
Edytować:
Json.NET działa przy użyciu tego samego JSON i klas jak w powyższym przykładzie.
GoogleSearchResults g1 = JsonConvert.DeserializeObject<GoogleSearchResults>(json);
Link: Serializacja i deserializacja JSON za pomocą Json.NET
Związane z
C # - parsowanie danych sformatowanych w formacie json w zagnieżdżonych tabelach
hasztujących Analizuj tablicę JSON
GoogleSearchResults
typ ma pola i właściwości o tej samej nazwie. Spróbuj zmienić nazwę swoich pól na wiodące znaki podkreślenia (wszystko, co będzie jednoznaczne między nimi).Odpowiedzi:
[Aktualizacja]
Właśnie zdałem sobie sprawę, dlaczego nie otrzymujesz wyników z powrotem ... masz brakującą linię w swojej
Deserialize
metodzie. Zapomniałeś przypisać wyniki doobj
:Również dla odniesienia, oto
Serialize
metoda:Edytować
Jeśli chcesz użyć Json.NET tutaj, to odpowiednik metod Serialize / Deserialize do powyższego kodu.
Deserializuj:
Serializuj:
Jest to już część Json.NET, więc możesz po prostu wywoływać je w klasie JsonConvert.
Link: Serializacja i deserializacja JSON za pomocą Json.NET
Powodem, dla którego otrzymujesz StackOverflow, jest twój
Properties
.Weźmy na przykład ten:
Zauważ, że w
getter
zwracasz rzeczywistą właściwość (tzn. Getter właściwości wywołuje się w kółko), a zatem tworzysz nieskończoną rekurencję.Właściwości (w 2.0) powinny być zdefiniowane następująco:
Masz pole prywatne, a następnie zwracasz wartość tego pola w getterze i ustawiasz wartość tego pola w seterze.
Przy okazji, jeśli używasz frameworka 3.5, możesz po prostu to zrobić i ominąć pola zapasowe, a kompilator zajmie się tym:
źródło
DataContractJsonSerializer
jest dostępny tylko w frameworku 3.5, nie?Twoja klasa danych nie pasuje do obiektu JSON. Zamiast tego użyj tego:
Ponadto nie trzeba tworzyć instancji klasy, aby uzyskać jej typ do deserializacji:
źródło
Znalazłem takie podejście, które analizuje JSON w obiekt dynamiczny , rozszerza on
DynamicObject
iJavascriptConverter
zamienia ciąg znaków w obiekt.DynamicJsonObject
Przetwornik
Zastosowanie ( przykładowy json ):
Ta metoda musi mieć wartość true, w przeciwnym razie spowoduje błąd. Np. Możesz zgłosić błąd, jeśli klucz nie istnieje.
Zwracanie
true
i opróżnianieresult
zwróci pustą wartość zamiast zgłaszania błędu.źródło
Myślę, że cały przykład byłby użyteczny. To jest przykład tego problemu.
źródło
Próbowałem użyć powyższego kodu, ale nie działałem. Zwrócona przez Google struktura JSON jest tak różna i istnieje bardzo ważna chybiąca funkcja pomocnicza: wywołanie
DataContractJsonSerializer.ReadObject()
tego faktycznie deserializuje dane JSON do obiektu.Oto kod, który DZIAŁA w 2011 roku:
Aby uzyskać treść pierwszego wyniku, wykonaj:
źródło
Dziękuję wszystkim za pomoc. To jest moja ostateczna wersja i działa dzięki twojej połączonej pomocy! Ja pokazuję tylko zmiany zrobiłem, reszta pochodzi z Joe Chung pracy
i
źródło
Żądanie interfejsu API Map Google i parsowanie DirectionsResponse za pomocą C #, zmień json w adresie URL na xml i użyj następującego kodu, aby przekształcić wynik w przydatny obiekt listy ogólnej C #.
Zajęło mi to trochę czasu. Ale oto jest
Mam nadzieję, że to komuś pomoże.
źródło