Ich versuche, einige JSON-Daten aus der Google AJAX-Such-API zu analysieren. Ich habe diese URL und möchte sie aufschlüsseln, damit die Ergebnisse angezeigt werden. Ich habe diesen Code derzeit geschrieben, bin aber ziemlich verloren, was als nächstes zu tun ist, obwohl es eine Reihe von Beispielen mit vereinfachten JSON-Zeichenfolgen gibt.
Da ich mit C # und .NET im Allgemeinen neu bin, habe ich Probleme, eine echte Textausgabe für meine ASP.NET-Seite zu erhalten. Daher wurde mir empfohlen, JSON.NET auszuprobieren. Könnte mich jemand in die richtige Richtung weisen, einfach einen Code zu schreiben, der JSON von der Google AJAX Search API aufnimmt und auf dem Bildschirm ausdrucken kann?
EDIT: ALLES BEHOBEN! Alle Ergebnisse funktionieren einwandfrei. Nochmals vielen Dank 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; }
}
}
Der Code wird derzeit perfekt kompiliert und ausgeführt, gibt jedoch keine Ergebnisse zurück. Könnte mir jemand bei der Rücksendung der gewünschten Ergebnisse helfen, damit die Ergebnisse auf dem Bildschirm ausgedruckt werden können?
Bearbeiten:
Json.NET verwendet denselben JSON und dieselben Klassen wie im obigen Beispiel.
GoogleSearchResults g1 = JsonConvert.DeserializeObject<GoogleSearchResults>(json);
Link: Serialisieren und Deserialisieren von JSON mit Json.NET
verbunden
C # - Parsen von JSON- formatierten Daten in verschachtelte Hashtabellen
Analysieren Sie das JSON-Array
GoogleSearchResults
Typ verfügt über Felder und Eigenschaften mit demselben Namen. Versuchen Sie, Ihre Felder mit führenden Unterstrichen umzubenennen (alles, was zwischen den beiden eindeutig ist).Antworten:
[Update]
Ich habe gerade festgestellt, warum Sie keine Ergebnisse zurückerhalten haben ... Sie haben eine fehlende Zeile in Ihrer
Deserialize
Methode. Sie haben vergessen, die Ergebnisse Ihrem zuzuweisenobj
:Hier ist nur als Referenz die
Serialize
Methode:Bearbeiten
Wenn Sie Json.NET verwenden möchten, finden Sie hier die entsprechenden Serialize / Deserialize-Methoden wie im obigen Code.
Deserialisieren:
Serialisieren:
Dies ist bereits Teil von Json.NET, sodass Sie sie einfach in der JsonConvert-Klasse aufrufen können.
Link: Serialisieren und Deserialisieren von JSON mit Json.NET
Der Grund, warum Sie einen StackOverflow erhalten, liegt an Ihrem
Properties
.Nehmen Sie zum Beispiel dieses:
Beachten Sie, dass Sie in der
getter
die eigentliche Eigenschaft zurückgeben (dh der Getter der Eigenschaft ruft sich immer wieder selbst auf) und somit eine unendliche Rekursion erstellen.Eigenschaften (in 2.0) sollten wie folgt definiert werden:
Sie haben ein privates Feld und geben dann den Wert dieses Feldes im Getter zurück und legen den Wert dieses Feldes im Setter fest.
Übrigens, wenn Sie das 3.5 Framework verwenden, können Sie dies einfach tun und die Hintergrundfelder vermeiden, und den Compiler sich darum kümmern lassen:
quelle
DataContractJsonSerializer
ist das nur im 3.5 Framework verfügbar, oder?Ihre Datenklasse stimmt nicht mit dem JSON-Objekt überein. Verwenden Sie stattdessen Folgendes:
Außerdem müssen Sie die Klasse nicht instanziieren, um ihren Typ für die Deserialisierung zu erhalten:
quelle
Ich habe diesen Ansatz gefunden, der JSON in ein dynamisches Objekt analysiert , a erweitert
DynamicObject
undJavascriptConverter
die Zeichenfolge in ein Objekt verwandelt.DynamicJsonObject
Konverter
Verwendung ( Beispiel json ):
Diese Methode muss true zurückgeben, da sonst ein Fehler ausgegeben wird. Sie können beispielsweise einen Fehler auslösen, wenn kein Schlüssel vorhanden ist.
Beim Zurückgeben
true
und Entleerenresult
wird ein leerer Wert zurückgegeben, anstatt einen Fehler auszulösen.quelle
Ich denke nur, dass das ganze Beispiel nützlich wäre. Dies ist das Beispiel für dieses Problem.
quelle
Ich habe versucht, den obigen Code zu verwenden, aber es hat nicht funktioniert. Die von Google zurückgegebene JSON-Struktur ist so unterschiedlich und es gibt einen sehr wichtigen Fehler in der Hilfsfunktion: Ein Aufruf
DataContractJsonSerializer.ReadObject()
, der die JSON-Daten tatsächlich in das Objekt deserialisiert.Hier ist der Code, der 2011 funktioniert:
Um den Inhalt des ersten Ergebnisses zu erhalten, gehen Sie wie folgt vor:
quelle
Vielen Dank für Ihre Hilfe. Dies ist meine endgültige Version und sie funktioniert dank Ihrer kombinierten Hilfe! Ich zeige nur die Änderungen, die ich vorgenommen habe, der Rest stammt aus Joe Chungs Arbeit
und
quelle
Google Map API-Anforderung und Analyse von DirectionsResponse mit C #, ändern Sie den JSON in Ihrer URL in XML und verwenden Sie den folgenden Code, um das Ergebnis in ein verwendbares generisches C # -Listenobjekt umzuwandeln.
Ich habe eine Weile gebraucht, um es zu machen. Aber hier ist es
Ich hoffe das wird jemandem helfen.
quelle