2011-07-11 13 views
4

我有Deserialising一個JSON字符串列表的問題問題Deserialising JSON列出<T>

的TCProject如下:

[JsonObject(MemberSerialization.OptIn)] 
    public class TCProject 
    { 
     public override string ToString() 
     { 
      return Name; 
     } 

     [JsonProperty(PropertyName = "archived")] 
     public bool Archived { get; set; } 

     [JsonProperty(PropertyName = "description")] 
     public string Description { get; set; } 

     [JsonProperty(PropertyName = "href")] 
     public string Href { get; set; } 

     [JsonProperty(PropertyName = "id")] 
     public string Id { get; set; } 

     [JsonProperty(PropertyName = "name")] 
     public string Name { get; set; } 

     [JsonProperty(PropertyName = "webUrl")] 
     public string WebUrl { get; set; } 
    } 

JSON字符串如下所示:

{"project":[{"name":"GCUK","id":"project11","href":"/httpAuth/app/rest/projects/id:project11"},{"name":"Interiors In Spain","id":"project3","href":"/httpAuth/app/rest/projects/id:project3"}]} 

到字符串轉換的代碼如下:

public IEnumerable<TCProject> GetAllProjects() 
     { 
      var uri = _connection.CreateUri("/httpAuth/app/rest/projects"); 
      var request = _connection.Request(uri); 

      var projects = JsonConvert.DeserializeObject<List<TCProject>>(request); 

    return projects; 
} 

我得到異常:

Newtonsoft.Json.JsonSerialisationException:{ 「無法反序列化JSON對象轉換型 'System.Collections.Generic.List`1 [TCProject]'」}

那裏一定是東西很容易,我很想念 - 任何人有任何想法?

+0

是什麼,你接收到這個樣子的方法? – jcolebrand

+0

整個方法現在存在 - 的_connection.Request只返回一個JSON字符串 - 它沒有做什麼特別的吧 – stack72

+0

哦,我纔剛剛意識到這是一般Silverlight的問題..我永遠不會做的Silverlight ...無法這裏弄清楚爲什麼我不能得到的東西來解決VS ... – jcolebrand

回答

3

我敢肯定,如果你創建了一個屬性的類名爲項目,那是一個List並反序列化到這個對象,所有的東西都可以工作。

//Using a page "test.aspx" in my existing project (I already had it open) 
using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string s = "{\"project\":[{\"name\":\"GCUK\",\"id\":\"project11\",\"href\":\"/httpAuth/app/rest/projects/id:project11\"},{\"name\":\"Interiors In Spain\",\"id\":\"project3\",\"href\":\"/httpAuth/app/rest/projects/id:project3\"}]}"; 
     var p = JsonConvert.DeserializeObject<TCProjectWrapper>(s); 
     s = "this"; //for easy breakpointing 
    } 
} 
[JsonObject(MemberSerialization.OptIn)] 
public class TCProjectWrapper { 
    [JsonProperty(PropertyName = "project")] 
    private List<TCProject> Project { get; set; } 
} 
[JsonObject(MemberSerialization.OptIn)] 
public class TCProject { 
    public override string ToString() { 
     return Name; 
    } 

    [JsonProperty(PropertyName = "archived")] 
    public bool Archived { get; set; } 

    [JsonProperty(PropertyName = "description")] 
    public string Description { get; set; } 

    [JsonProperty(PropertyName = "href")] 
    public string Href { get; set; } 

    [JsonProperty(PropertyName = "id")] 
    public string Id { get; set; } 

    [JsonProperty(PropertyName = "name")] 
    public string Name { get; set; } 

    [JsonProperty(PropertyName = "webUrl")] 
    public string WebUrl { get; set; } 
} 
+0

你先生是一個天才!非常感謝! – stack72

+0

這是我一次下載正確的庫後所做的。作爲參考,我將使用我使用的代碼更新您的答案。 – jcolebrand

+0

對不起,我沒有提供完整的示例,我還沒有掌握在這裏的代碼示例。 –

0

我覺得在這種情況下,你需要抓住只是JSON的陣列部分反序列化到像這樣的列表:

public IEnumerable<TCProject> GetAllProjects() 
    { 
     var uri = _connection.CreateUri("/httpAuth/app/rest/projects"); 
     var request = _connection.Request(uri); 

     var projects = JsonConvert.DeserializeObject<List<TCProject>>(request.Substring(11, request.Length - 1)); 

     return projects; 
    } 
+0

那個......好像有點過。我會認爲裝飾父對象會更容易。 – jcolebrand

+0

我不認爲我可以指望子字符串和每次不幸的長度 – stack72

+0

然後,你也可以創建另一個對象與物業稱爲項目和反序列化到該對象,該屬性將有一個列表給你。 – JTWebMan