La désérialisation JSON à l'aide de C#
Trouver quelques difficultés dans l'approvisionnement de l'information en essayant de désérialiser JSON en C#.
J'ai les résultats de la recherche personnalisée Google retourné au format JSON. Je veux juste vérifier à travers mes pas et d'établir l'ordre en essayant de désérialiser. Est-ce vrai?
- J'ai besoin de créer des classes de match
le format JSON. Comme une sorte de
la création d'un fichier de schéma. - Utiliser le
JavaScriptSerializer()
classe et
deserialize
méthode pour extraire la
pertinentes bits.
L'une des questions je pense que je vais le rencontrer, c'est que je n'ai pas besoin de toutes les données renvoyées, mais seulement les liens html. Comment puis-je y parvenir?
Mise à JOUR
J'ai mis à jour ma question avec le JSON suivants extrait de code et de code C#. Je veux à la sortie de la chaîne de "liens" de la console, mais il ne semble pas fonctionner. Je pense que je suis la définition de mes classes à tort?
JSON de Recherche Personnalisé de Google
handleResponse({
"kind": "customsearch#search",
"url": {
"type": "application/json",
"template": "https://www.googleapis.com/customsearch/v1?q\u003d{searchTerms}&num\u003d{count?}&start\u003d{startIndex?}&hr\u003d{language?}&safe\u003d{safe?}&cx\u003d{cx?}&cref\u003d{cref?}&sort\u003d{sort?}&alt\u003djson"
},
"queries": {
"nextPage": [
{
"title": "Google Custom Search - lectures",
"totalResults": 9590000,
"searchTerms": "lectures",
"count": 1,
"startIndex": 2,
"inputEncoding": "utf8",
"outputEncoding": "utf8",
"cx": "017576662512468239146:omuauf_lfve"
}
],
"request": [
{
"title": "Google Custom Search - lectures",
"totalResults": 9590000,
"searchTerms": "lectures",
"count": 1,
"startIndex": 1,
"inputEncoding": "utf8",
"outputEncoding": "utf8",
"cx": "017576662512468239146:omuauf_lfve"
}
]
},
"context": {
"title": "Curriculum",
"facets": [
[
{
"label": "lectures",
"anchor": "Lectures"
}
],
[
{
"label": "assignments",
"anchor": "Assignments"
}
],
[
{
"label": "reference",
"anchor": "Reference"
}
]
]
},
"items": [
{
"kind": "customsearch#result",
"title": "EE364a: Lecture Videos",
"htmlTitle": "EE364a: \u003cb\u003eLecture\u003c/b\u003e Videos",
"link": "http://www.stanford.edu/class/ee364a/videos.html",
"displayLink": "www.stanford.edu",
"snippet": "Apr 7, 2010 ... Course materials. Lecture slides · Lecture videos (2008) · Review sessions. Assignments. Homework · Reading. Exams. Final exam ...",
"htmlSnippet": "Apr 7, 2010 \u003cb\u003e...\u003c/b\u003e Course materials. \u003cb\u003eLecture\u003c/b\u003e slides · \u003cb\u003eLecture\u003c/b\u003e videos (2008) · Review sessions. \u003cbr\u003e Assignments. Homework · Reading. Exams. Final exam \u003cb\u003e...\u003c/b\u003e",
"cacheid": "TxVqFzFZLOsJ"
}
]
}
);
C# Extrait De
public class GoogleSearchResults
{
public string link { get; set; }
}
public class Program
{
static void Main(string[] args)
{
//input search term
Console.WriteLine("What is your search query?:");
string searchTerm = Console.ReadLine();
//concantenate the strings using + symbol to make it URL friendly for google
string searchTermFormat = searchTerm.Replace(" ", "+");
//create a new instance of Webclient and use DownloadString method from the Webclient class to extract download html
WebClient client = new WebClient();
string Json = client.DownloadString("https://www.googleapis.com/customsearch/v1?key=My Key&cx=My CX&q=" + searchTermFormat);
//create a new instance of JavaScriptSerializer and deserialise the desired content
JavaScriptSerializer js = new JavaScriptSerializer();
GoogleSearchResults results = js.Deserialize<GoogleSearchResults>(Json);
Console.WriteLine(results);
//Console.WriteLine(htmlDoc);
Console.ReadLine();
}
}
Grâce
serializer.Deserialize(jsonContent, typeof(object))
. Selon le JSON vous allez obtenir un dictionnaire d'objet ou quelque chose comme ça, qui vous permet de travailler avec.OriginalL'auteur super9 | 2010-12-23
Vous devez vous connecter pour publier un commentaire.
- Je utiliser votre #2 approche: désérialiser avec le JavaScriptSerializer.
C'est ce que je fais pour désérialiser une réponse de Facebook:
....où Facebook.Les données.La ressource est définie comme ceci:
La
responseText
que je suis la désérialisation de ressemble à ceci:Mais depuis je n'ai qu'une propriété définie dans le
Resource
classe, je ne désérialiser que. Définir les champs de votre classe que vous voulez désérialiser.Il fonctionne à utiliser l'héritage, bien sûr. Vous pouvez définir vos classes de données comme ceci:
}
...et puis vous pouvez désérialiser un
Person
objet.MODIFIER
Ok, compte tenu de l'échantillon json que vous avez fourni dans la mise à jour de question, voici comment j'ai écrit les classes de tenir la réponse:
Et voici le code C# pour désérialiser:
Quelques commentaires:
kind
, correspondant à la première propriété nommée dans l'objet json. Vous avez eulink
ce qui n'est pas d'aller travailler, parce quelink
n'est pas le nom d'un haut niveau de propriété d'objet json. Il y a des propriétés de niveau inférieur dans la hiérarchie de votre json nommé "lien" mais JavaScriptSerializer de ne pas sortir celles de niveau inférieur choses dans le niveau supérieur.url
propriété dans le json n'est pas une simple chaîne - c'est un objet json avec deux propriétés, chacune avec une valeur de chaîne. Donc SourceUrl comme une classe en C# obtient deux propriétés de la chaîne, chacune avec le nom approprié pour désérialiser un de ces propriétés nommées.GoogleSearchItem
. Cette classe a un tas de simples propriétés de la chaîne. Les propriétés de la classe C# pourrait être de type int ou autre, si c'est ce que le json exige.Console.WriteLine(result)
, vous verrez le résultat de laToString()
méthode qui est implicitement invoquée parConsole.WriteLine
. Ce sera simplement imprimer le nom du type, dans ce cas est "GoogleSearchResults", ce qui n'est pas ce que vous voulez, je pense. Afin de voir ce qui est dans l'objet, vous avez besoin de sérialiser, comme je l'ai montré. Dans la sortie, vous verrez uniquement les valeurs des choses que vous désérialisé. À l'aide des classes, j'ai fourni, le résultat aura moins d'informations que l'original, car je n'ai pas fournir des propriétés dans la classe C# correspondant à certains des json propriétés, de sorte que ceux qui n'étaient pas désérialisé.ok, j'ai mis à jour ma réponse.
Wow j'ai besoin de digérer. Je pense que mon idée de ce qui se passe n'est pas encore ferme. Ce qui se passe quand vous 'désérialiser' un Json doc? Je ne comprends pas pourquoi j'ai besoin de désérialiser les bits je veux et puis re-sérialiser afin d'être en mesure à la sortie car j'ai déjà mis le reçu de réponse pour le type de données
string
.Sur les concepts: Pour désérialiser un json doc (ou une chaîne) est de créer un objet et de le remplir ses propriétés avec des valeurs extraites de la chaîne json. Pour sérialiser un objet instance de json - à l'inverse - est de convertir à partir de la mémoire (.NET de l'objet) la forme d'une chaîne json, visible par les humains.
Vous avez besoin de sérialiser vos GoogleSearchResults objet afin de le visualiser comme un string, quand vous l'imprimer. Évidemment, la désérialisation et puis (re-)sérialisation est circulaire, et un vrai programme ne le ferais pas. Je suis le seul à faire ici à des fins de diagnostic: de sorte que vous pouvez voir le résultat de la dé-sérialisation.
OriginalL'auteur
Vous pouvez prendre un coup d'oeil à Json.NET et ses LINQ soutien à la création et à la requête JSON. Par la rédaction d'une belle requête LINQ, vous obtiendrez seulement les choses dont vous avez besoin (vous pouvez sélectionner, regrouper par, count, min, max, tout ce que vous voulez).
LINQ
est. Ai-je besoin de savoirLINQ
afin d'utiliser leJson.NET
?oui, en fait, il est fortement recommandé d'apprendre
LINQ
avant d'utiliserLINQ
. Et pas seulement pour ce cas. Il sera extrêmement bénéfique pour vous comme une .NET développeur en général.est-ce que votre réponse assumer les données JSON est des lignes/colonnes et pas un objet personnalisé?
il n'a pas vraiment d'importance. Tous je suppose, c'est d'en JSON valide qui est une assez sûr hypothèse depuis sa source, c'est Google 🙂 Vous pouvez interroger comme vous le souhaitez avec LINQ. De la même manière que vous le feriez requête de tout .NETTE de l'objet en mémoire. C'est la force de LINQ. Il n'importe pas vraiment ce que le format de vos données. Vous de la requête de la même façon (SQL, XML, des objets en mémoire, JSON,...).
Je préfère utiliser ce que MS déjà navires .NET - le JavaScriptSerializer.
OriginalL'auteur
http://msdn.microsoft.com/en-us/library/bb412170.aspx
http://msdn.microsoft.com/en-us/library/bb410770.aspx
Sortir de la propriété dont vous avez besoin après que vous avez converti la représentation JSON d'un type dans votre application en C#. Je ne pense pas qu'il y a un moyen d'extraire une seule propriété de la représentation JSON avant d'avoir converti (même si je ne suis pas sûr).
OriginalL'auteur