2014-12-28 56 views
1

我需要反序列化這個JSON:C#JSON解開財產

{ "user_id": 0, "resource_id": 0, "resource_name": "file.xml" ...} 

對此類:

public class Resource 
{ 
    public ResourceId ResourceId { get; set; } 
    public string ResourceName { get; set; } 
    ... 
} 

public class ResourceId 
{ 
    public int UserId { get; set; } 
    public int ResourceId { get; set; } 
} 

我需要解串器創建一個新的ResourceID對象存儲 「RESOURCE_ID」 的價值和「user_id」。另外,我需要將對象序列化。那可能嗎?

我正在使用JSON.net反序列化器/序列化程序。

謝謝!

+0

好吧,就像我現在看到的那樣,JSON數據只包含3個包含在RootObject中的值......但我沒有那種JSON數據的經驗,而我只是特別粘貼了VS中的JSON數據。 – CularBytes

回答

0

首先,您的ResourceId類甚至不會編譯,因爲member names cannot be the same as their enclosing type。相反,你必須做一些事情,如:

public class ResourceId 
{ 
    public int UserId { get; set; } 
    public int Id { get; set; } 
} 

你的下一個問題是,您的包含ResourceId類的屬性在JSON正在出現的容器類Resource的性能。對付這種不改變你的數據模型最好的辦法是連載他們作爲私人在容器類代理底層ResourceId的屬性,像這樣的屬性:

[DataContract] 
public class Resource 
{ 
    [IgnoreDataMember] 
    public ResourceId ResourceId { get; set; } 

    [DataMember(Name="user_id")] 
    private int? user_id { 
     get 
     { 
      return ResourceId == null ? (int ?)null : ResourceId.UserId; 
     } 
     set 
     { 
      if (value == null) 
      { 
       ResourceId = null; 
      } 
      else 
      { 
       if (ResourceId == null) 
        ResourceId = new ResourceId(); 
       ResourceId.UserId = value.Value; 
      } 
     } 
    } 

    [DataMember(Name="resource_id")] 
    private int? resource_id 
    { 
     get 
     { 
      return ResourceId == null ? (int?)null : ResourceId.Id; 
     } 
     set 
     { 
      if (value == null) 
      { 
       ResourceId = null; 
      } 
      else 
      { 
       if (ResourceId == null) 
        ResourceId = new ResourceId(); 
       ResourceId.Id = value.Value; 
      } 
     } 
    } 

    [DataMember(Name="resource_name")] 
    public string ResourceName { get; set; } 
} 

的屬性應該是因爲當null是一個可能的值時,單獨更改它們是沒有意義的。例如:

resource.user_id = null; 
resource.resource_id = 3; 

可能會產生意想不到的結果。

相反的[DataContract][IgnoreDataMember][DataMember],可以使用[JsonIgnore][JsonProperty]。使用數據契約屬性可使該類與數據契約序列化程序兼容,這可能很有用。

+1

這解決了我的問題。謝謝! –