2013-06-13 3 views
3

Voici mon code:Parsing un tableau de JSON dans une classe C#

Encoding enc = System.Text.Encoding.GetEncoding(1252); 
StreamReader loResponseStream = new StreamReader(resp.GetResponseStream(), enc); 
JsonSerializer serializer = new JsonSerializer(); 
JsonTextReader jsreader = new JsonTextReader(loResponseStream); 
results = (mHealthData)serializer.Deserialize(jsreader, typeof(mHealthData)); *** 
loResponseStream.Close(); 

public class mHealthData 
{ // Class for the Mhealth Data 
    public class RootObject 
    { 
     public string source { get; set; } 
     public string name { get; set; } 
     public string type { get; set; } 
     public string unit { get; set; } 
     public double value { get; set; } 
     public string timestamp { get; set; } 
    } 
} 

Ceci est l'erreur que je reçois sur la ligne marquée avec un * *:

Impossible désérialiser le tableau JSON actuel (par exemple [1,2,3]) dans le type "MHealthPlugin.mHealthData" 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 {"name": "value"}) 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<T> peut être désérialisé à partir d'un tableau JSON. JsonArrayAttribute peut également être ajouté au type pour le forcer à désérialiser à partir d'un tableau JSON.

Je n'ai aucune idée de comment résoudre ce problème. J'ai essayé de mettre List<mHealthData> pratiquement partout dans le code et ça n'aide pas. Les autres appels que je fais fonctionnent bien. Pour référence, voici un exemple de ce que le JSON je suis en train d'analyser ressemble:

[{"source":"hi","name":"G","type":"number","unit":null,"value":126,"timestamp":"1974-07-27T09:35:12Z"},{"source":"hi","name":"G","type":"number","unit":null,"value":120,"timestamp":"1974-07-27T09:35:12Z"}] 
+0

vous ne pouvez pas définir une classe comme une liste, en ce moment, vous avez juste une classe nommée Liste . ce n'est pas vraiment une liste ou liée à une liste du tout. – Nealon

+0

FYI: Si vous utilisez JSON.NET (aka Newtonsoft.Json), il y a des one-liners pour sérialiser vers/depuis une chaîne: la désérialisation peut être faite avec 'var x = JsonConvert.DeserializeObject (myJson); '. Beaucoup plus agréable que de traiter tous les flux et les lecteurs. –

+0

aussi, de quel type est votre variable de réponse? – Nealon

Répondre

3

Votre mHealthData classe n'a rien en elle, à l'exception d'une classe imbriquée. Prenez du recul et voyez comment vos données sont censées être définies.

Il semble que vous souhaitiez une classe RootObject. Dans ce cas, la classe doit être:

public class RootObject 
{ 
    public string source { get; set; } 
    public string name { get; set; } 
    public string type { get; set; } 
    public string unit { get; set; } 
    public double value { get; set; } 
    public string timestamp { get; set; } 
} 

Ensuite, lorsque vous désérialiser, vous vous retrouverez avec un objet de type RootObject[] - votre JSON est tout simplement un tableau, pas un objet contenant un tableau.