2011-07-20 4 views
2

Ceci est une continuation d'une question précédente de la mienne. La solution a fonctionné pour ce que j'essayais de faire à l'époque mais a cassé une grande partie de mon code. Je sais que c'était une mauvaise habitude de ne pas m'assurer à l'avance mais oui ... vous vivez et apprenez.plus json C# numéros

Anyhoo, voici la Q: an easy way to serialise c# objects

Ce que je veux savoir est: est-il possible d'obtenir la bibliothèque NewtonSoft pour gérer ce genre de choses? Si oui, comment? Si non, des suggestions? Ce que je fais est de bavarder avec une application RoR3 en utilisant json, maintenant je ne peux pas désérialiser la réponse. voici un petit code:

La réponse que je reçois de RoR ressemble:

[{"directory":{"created_at":"2011-07-20T22:29:38Z","drive_info":1,"id":15,"name":"New Drive","parent":0,"size":0,"updated_at":"2011-07-20T22:29:39Z","user":1}}] 

Je suis en train de deserialise dans une liste d'objets Directory en utilisant:

public static CompositeCollection deserialise<T>(string json) 
    { 
     CompositeCollection result = new CompositeCollection(); 
     JArray arr = JArray.Parse(json); 

     foreach (JObject obj in arr) 
     { 
      result.Add(JsonConvert.DeserializeObject<T>(obj.First.First.ToString())); 
     } 
     return result; 
    } 

et la partie pertinente de la classe de répertoire ressemble à:

// [Serializable] 
// [DataContract] 
public class Directory 
{ 
    // [DataMember] 
    public int id { get; set; } 

// [DataMember] 
    public string name { get; set; } 

// [DataMember] 
    public int parent { get; set; } 

// [DataMember] 
    public int drive_info { get; set; } 

//  [DataMember] 
    public int size { get; set; } 

//  [DataMember] 
    public int user { get; set; } 

//  [DataMember] 
    public string state 
    { 
     get 
     { 
      /* if (parent == 0) 
       return _state.identify(); 
      Directory parental; 
      return parental.state;*/ 
      if (parental != null) 
       return parental.state; 
      return _state.identify(); 
     } 
     set 
     { 
      _state = StateFactory.getState(value); 
     } 
    } 

    //[JsonIgnore] 
    blah... 

Je peux désérialiser la plupart du temps par unc ommenting [Serializable] (parfois j'obtiens l'erreur suivante: L'objet de type 'System.Int32' ne peut pas être converti en type 'OffloadUI.Directory'. J'étudie toujours), et je peux sérialiser en [DataContract] et toutes les instances de [DataMember]. Ce dont j'ai besoin, c'est quelque chose qui fonctionnera dans les deux sens.

+0

Rendez votre échantillon plus court et clarifiez ce que vous demandez réellement. Jusqu'à présent, il est plus "TODO" commentaire plutôt que de question ... –

+0

Désolé, je pensais que ma question était claire. Je veux savoir comment l'arrêter pour lancer des exceptions. Est-ce que Newtonsoft dll est un mauvais choix pour mon application? ou y a-t-il un moyen de faire fonctionner cela? – Sheena

+1

Ne sait pas répondre, mais si vous êtes coincé, essayez peut-être: http://json.codeplex.com/ –

Répondre

1

Grâce à Zootius, j'ai trouvé un guide utile. Voici ce que j'ai fait, fonctionne comme un acheté:

[JsonObject(MemberSerialization.OptIn)] 
public class Directory 
{ 
    [JsonProperty] 
    public int id { get; set; } 

    [JsonProperty] 
    public string name { get; set; } 

    [JsonProperty] 
    public int parent { get; set; }