2011-07-20 39 views
2

這是我以前的一個問題的延續。該解決方案適用於我當時正在嘗試做的事情,但打破了我的許多代碼。我知道這是不好的做法,不要事先確定,但是耶...你活着學習。更多json c#問題

安美居,這裏的問:an easy way to serialise c# objects

我想知道的是:有沒有辦法讓NewtonSoft庫來處理這個東西?如果是,如何?如果不是,建議?

我在做什麼是使用json聊天到RoR3應用程序,現在我不能反序列化反應。這裏有一個小代碼:

我從回報率得到我的答覆是這樣的:

[{"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}}] 

我試圖用它deserialise到目錄對象的列表:

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; 
    } 

和目錄類的相關部分看起來像:

// [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... 

我可以反序列化大部分時間unc ommenting [Serializable](有時我得到以下錯誤:'System.Int32'類型的對象不能轉換爲類型'OffloadUI.Directory'。仍然在調查),並且我可以通過解除[DataContract]和[DataMember]的所有實例來連載。我需要的是能夠在兩個方向上工作的東西。

+0

讓你縮短樣本並清楚你實際詢問的內容。到目前爲止,它是更多的「TODO」評論,而不是問題... –

+0

對不起,我想我的問題很清楚。我想知道如何讓它停止拋出異常。 Newtonsoft dll是我的應用程序的不好選擇嗎?還是有辦法讓這個工作? – Sheena

+1

不知道答案,但如果您遇到問題,請嘗試:http://json.codeplex.com/ –

回答

1

感謝Zootius,我找到了一個有用的指南。這就是我所做的,像買了一樣:

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

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

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