J'essaie d'analyser certaines données JSON de l'API de recherche Google AJAX. J'ai cette URL et je voudrais la décomposer afin que les résultats soient affichés. J'ai actuellement écrit ce code, mais je suis assez perdu quant à ce qu'il faut faire ensuite, bien qu'il existe un certain nombre d'exemples avec des chaînes JSON simplifiées.
Étant nouveau sur C # et .NET en général, j'ai eu du mal à obtenir une sortie texte authentique pour ma page ASP.NET, il m'a donc été recommandé d'essayer JSON.NET. Quelqu'un pourrait-il m'orienter dans la bonne direction pour simplement écrire du code qui prendra JSON de l'API de recherche Google AJAX et l'imprimera à l'écran?
EDIT: TOUS FIXES! Tous les résultats fonctionnent bien. Merci encore 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; }
}
}
Le code se compile et s'exécute actuellement parfaitement, mais ne renvoie aucun résultat. Quelqu'un pourrait-il m'aider à renvoyer ce dont j'ai besoin, les résultats prêts à être imprimés à l'écran?
Éditer:
Json.NET fonctionne en utilisant le même JSON et les mêmes classes que l'exemple ci-dessus.
GoogleSearchResults g1 = JsonConvert.DeserializeObject<GoogleSearchResults>(json);
Lien: sérialisation et désérialisation de JSON avec Json.NET
en relation
C # - analyser les données au format json dans des tables de hachage imbriquées Analyser le
tableau JSON
GoogleSearchResults
type a des champs et des propriétés qui portent le même nom. Essayez de renommer vos champs avec des traits de soulignement en tête (tout ce qui peut lever l'ambiguïté entre les deux).Réponses:
[Mise à jour]
Je viens de comprendre pourquoi vous ne receviez pas de résultats en retour ... il vous manque une ligne dans votre
Deserialize
méthode. Vous oubliez d'attribuer les résultats à votreobj
:Aussi, juste pour référence, voici la
Serialize
méthode:Éditer
Si vous souhaitez utiliser Json.NET, voici les méthodes Serialize / Deserialize équivalentes au code ci-dessus.
Désérialiser:
Sérialiser:
Ils font déjà partie de Json.NET, vous pouvez donc simplement les appeler sur la classe JsonConvert.
Lien: sérialisation et désérialisation de JSON avec Json.NET
Maintenant, la raison pour laquelle vous obtenez un StackOverflow est à cause de votre
Properties
.Prenons par exemple celui-ci:
Notez que dans le
getter
, vous renvoyez la propriété réelle (c. -à-d . Que le getter de la propriété se rappelle sans cesse), et donc vous créez une récursion infinie.Les propriétés (en 2.0) doivent être définies comme telles:
Vous avez un champ privé, puis vous retournez la valeur de ce champ dans le getter et définissez la valeur de ce champ dans le setter.
Btw, si vous utilisez le Framework 3.5, vous pouvez simplement le faire et éviter les champs de sauvegarde, et laisser le compilateur s'en occuper:
la source
DataContractJsonSerializer
n'est disponible que dans le framework 3.5, non?Votre classe de données ne correspond pas à l'objet JSON. Utilisez-le à la place:
De plus, vous n'avez pas besoin d'instancier la classe pour obtenir son type pour la désérialisation:
la source
J'ai trouvé cette approche qui analyse JSON en un objet dynamique , elle étend un
DynamicObject
etJavascriptConverter
pour transformer la chaîne en un objet.DynamicJsonObject
Convertisseur
Utilisation ( exemple json ):
Cette méthode doit renvoyer true, sinon elle générera une erreur. Par exemple, vous pouvez lancer une erreur si une clé n'existe pas.
Retourner
true
et viderresult
retournera une valeur vide plutôt que de lancer une erreur.la source
Je pense simplement que l'exemple entier serait utile. Voici l'exemple de ce problème.
la source
J'ai essayé d'utiliser le code ci-dessus mais cela n'a pas fonctionné. La structure JSON renvoyée par Google est tellement différente et il y a un manque très important dans la fonction d'assistance: un appel à
DataContractJsonSerializer.ReadObject()
cela désérialise réellement les données JSON dans l'objet.Voici le code qui FONCTIONNE en 2011:
Pour obtenir le contenu du premier résultat, procédez comme suit:
la source
Merci à tous pour votre aide. Ceci est ma version finale, et cela fonctionne grâce à votre aide combinée! Je ne montre que les modifications que j'ai apportées, tout le reste est tiré du travail de Joe Chung
et
la source
Demandez à Google Map API et analysez DirectionsResponse avec C #, changez le json de votre URL en xml et utilisez le code suivant pour transformer le résultat en un objet de liste générique C # utilisable.
Ça m'a pris du temps à faire. Mais le voici
J'espère que cela aidera quelqu'un.
la source