2017-10-13 15 views
2

J'ai examiné l'exemple après l'exemple après l'exemple et aucune de mes tentatives ont fonctionné.Problème avec la désérialisation avec JSON avec C#

Je tente de désérialiser ce retour JSON:

{ 
    "status": "success", 
    "data": { 
    "result": "match", 
    "id_user": 26564, 
    "dob_match": null, 
    "first_name_match": null, 
    "last_name_match": null 
    }, 
    "code": 200 
} 

Voici ma JSON déclaration de classe d'objet:

[DataContract] 
internal class DccCoachApi 
{ 
    [DataMember] 
    public string result { get; set; } 
    public string id_user { get; set; } 
    public string dob_match { get; set; } 
    public string first_name_match { get; set; } 
    public string last_name_match { get; set; } 
} 

Dans ma méthode de flux, ma variable streamRead est remplie: {"status":"success","data":{"result":"match","id_user":26564,"dob_match":null,"first_name_match":null,"last_name_match":null},"code":200} La méthode 1 ne remplit pas coachId:

  using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(streamRead))) 
      { 
       // Deserialization from JSON 
       var deserializer = new DataContractJsonSerializer(typeof(DccCoachApi)); 
       var dccObj = (DccCoachApi)deserializer.ReadObject(ms); 
       coachId = dccObj.id_user; 
      } 

ne fait Méthode 2:

  DccCoachApi coach = new JavaScriptSerializer().Deserialize<DccCoachApi>(streamRead); 

      coachId = coach.id_user; 

ni ne méthode 3:

  JavaScriptSerializer js = new JavaScriptSerializer(); 
      DccCoachApi dccObj = js.Deserialize<DccCoachApi>(streamRead); 
      coachId = dccObj.id_user; 

ni ne méthode 4:

  dynamic dccObject = js.Deserialize<dynamic>(streamRead); 
      coachId = dccObject["id_user"]; 

L'erreur dure qui obtient produit quand je tire la valeur directement de la méthode 4 est: System.Collections.Generic.KeyNotFoundException: le La clé donnée n'était pas présente dans le dictionnaire. at System.Collections.Generic.Dictionary`2.get_Item (clé TKey)

Les méthodes 1-3 ne rencontrent pas d'erreur matérielle, mais elles remplissent coachId sans données. Est-ce que quelqu'un peut me faire savoir ce que je fais mal?

+0

Avez-vous essayé d'ajouter '[DataMember]' à chaque propriété au lieu de seulement la première propriété? –

+1

Votre dictionnaire JSON a trois clés: 'status',' data' et 'code'. Aucun n'apparaît dans votre classe 'DccCoachApi'. Cette classe semble être un type approprié pour le membre 'data'. – smarx

+2

Copiez le fichier json dans le Presse-papiers et à partir de VS ** Menu Édition ** -> ** Collage spécial ** -> ** Coller JSON comme Classes ** – Plutonix

Répondre

2

Vous pouvez simplement générer des classes appropriées ici: http://json2csharp.com/

Voici comment il devrait ressembler vous n'avez pas besoin DataMember attributs, il peut confondre le sérialiseur seulement désérialiser cette propriété unique:

public class Data 
{ 
    public string result { get; set; } 
    public int id_user { get; set; } 
    public object dob_match { get; set; } 
    public object first_name_match { get; set; } 
    public object last_name_match { get; set; } 
} 

public class RootObject 
{ 
    public string status { get; set; } 
    public Data data { get; set; } 
    public int code { get; set; } 
} 

code:

var deserializer = DataContractJsonSerializer(typeof(RootObject)); 
var root = (RootObject)deserializer.ReadObject(ms); 
var coachId = root.data.id_user; 
+0

Merci beaucoup! J'ai utilisé une légère variation du code et j'ai réussi à le faire fonctionner! Très apprécié!! –

0

Je révisé le code pour ressembler à ceci, et il est le dumping ma valeur parfaitement. Merci beaucoup à tous ceux qui m'ont aidé à atteindre la solution. Plutonix, merci aussi pour la pâte spéciale 411. Je n'avais aucune idée qui existait. Très utile!

   using (var reader = new StreamReader(webResponse.GetResponseStream())) 
      { 
       var streamRead = reader.ReadToEnd(); 
       reader.Close(); 
       using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(streamRead))) 
       { 
        JavaScriptSerializer js = new JavaScriptSerializer(); 
        DccCoachRootobject dccObj = js.Deserialize<DccCoachRootobject>(streamRead); 
        coachId = dccObj.data.id_user.ToString(); 
       } 
      }