J'essaie de lire mon résultat JSON.
Voici mon RootObject
public class RootObject
{
public int id { get; set; }
public bool is_default { get; set; }
public string name { get; set; }
public int quantity { get; set; }
public string stock { get; set; }
public string unit_cost { get; set; }
}
Voici mon résultat JSON
[{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0"}]
Voici mon code pour lire le résultat
public static RootObject GetItems(string user, string key, Int32 tid, Int32 pid)
{
// Customize URL according to geo location parameters
var url = string.Format(uniqueItemUrl, user, key, tid, pid);
// Syncronious Consumption
var syncClient = new WebClient();
var content = syncClient.DownloadString(url);
return JsonConvert.DeserializeObject<RootObject>(content);
}
Mais j'ai un problème avec cette erreur:
Impossible de désérialiser le tableau JSON actuel (par exemple [1,2,3]) dans le type 'avaris_cash_salepoint.BL.UniqueItemDataRootObject' car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement. Pour corriger cette erreur, changez le JSON en un objet JSON (par exemple {"nom": "valeur"}) ou changez le type désérialisé en un tableau ou un type qui implémente une interface de collection (par exemple ICollection, IList) comme List qui peut être désérialisé à partir d'un tableau JSON. JsonArrayAttribute peut également être ajouté au type pour le forcer à se désérialiser à partir d'un tableau JSON. Chemin '', ligne 1, position 1.
sur cette ligne: return JsonConvert.DeserializeObject (content);
Une aide pour corriger cette erreur?
Je pense que le problème que vous rencontrez est que votre JSON est une liste d'objets lorsqu'il arrive et qu'il ne se rapporte pas directement à votre classe racine.
var content
ressemblerait à quelque chose comme ça (je suppose):
[
{
"id": 3636,
"is_default": true,
"name": "Unit",
"quantity": 1,
"stock": "100000.00",
"unit_cost": "0"
},
{
"id": 4592,
"is_default": false,
"name": "Bundle",
"quantity": 5,
"stock": "100000.00",
"unit_cost": "0"
}
]
Remarque: utilisez http://jsonviewer.stack.hu/ pour formater votre JSON.
Donc, si vous essayez ce qui suit, cela devrait fonctionner:
public static List<RootObject> GetItems(string user, string key, Int32 tid, Int32 pid)
{
// Customize URL according to geo location parameters
var url = string.Format(uniqueItemUrl, user, key, tid, pid);
// Syncronious Consumption
var syncClient = new WebClient();
var content = syncClient.DownloadString(url);
return JsonConvert.DeserializeObject<List<RootObject>>(content);
}
Vous devrez ensuite itérer si vous ne souhaitez pas renvoyer une liste de RootObject
.
Je suis allé de l'avant et j'ai testé cela dans une application console, j'ai bien fonctionné.
C'est parce que le json que vous obtenez est un tableau de votre classe RootObject
, plutôt qu'une seule instance, changez votre DeserialiseObject<RootObject>
être quelque chose comme DeserialiseObject<RootObject[]>
(non testé).
Vous devrez ensuite modifier votre méthode pour renvoyer une collection de RootObject
ou effectuer un traitement supplémentaire sur l'objet désérialisé pour renvoyer une seule instance.
Si vous regardez une version formatée de la réponse que vous avez fournie:
[
{
"id":3636,
"is_default":true,
"name":"Unit",
"quantity":1,
"stock":"100000.00",
"unit_cost":"0"
},
{
"id":4592,
"is_default":false,
"name":"Bundle",
"quantity":5,
"stock":"100000.00",
"unit_cost":"0"
}
]
Vous pouvez voir deux instances là-dedans.
Vous pouvez l'utiliser pour résoudre votre problème:
private async void btn_Go_Click(object sender, RoutedEventArgs e)
{
HttpClient webClient = new HttpClient();
Uri uri = new Uri("http://www.school-link.net/webservice/get_student/?id=" + txtVCode.Text);
HttpResponseMessage response = await webClient.GetAsync(uri);
var jsonString = await response.Content.ReadAsStringAsync();
var _Data = JsonConvert.DeserializeObject <List<Student>>(jsonString);
foreach (Student Student in _Data)
{
tb1.Text = Student.student_name;
}
}
Vous avez un tableau, convertissez-le en objet, quelque chose comme:
données: [{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id ": 4592," is_default ": false," nom ":" Bundle "," quantité ": 5," stock ":" 100000.00 "," unit_cost ":" 0 "}]
Pour lire plus d'une astuce json (tableau, attribut), j'ai fait ce qui suit.
var jVariable = JsonConvert.DeserializeObject<YourCommentaryClass>(jsonVariableContent);
changer pour
var jVariable = JsonConvert.DeserializeObject <List<YourCommentaryClass>>(jsonVariableContent);
Parce que vous ne pouvez pas voir tous les bits de la méthode utilisée dans la boucle foreach. Exemple pour chaque boucle
foreach (jsonDonanimSimple Variable in jVariable)
{
debugOutput(jVariable.Id.ToString());
debugOutput(jVariable.Header.ToString());
debugOutput(jVariable.Content.ToString());
}
J'ai également reçu une erreur dans cette boucle et l'ai modifiée comme suit.
foreach (jsonDonanimSimple Variable in jVariable)
{
debugOutput(Variable.Id.ToString());
debugOutput(Variable.Header.ToString());
debugOutput(Variable.Content.ToString());
}
Ce pourrait être vous
Avant d'essayer de consommer votre objet json avec un autre objet, vérifiez simplement que l'api renvoie du json brut via le navigateur api/rootobject, pour mon cas, j'ai découvert que le fournisseur de données sous-jacent mssqlserver n'était pas en cours d'exécution et lève une exception non levée!
aussi simple que cela :)