2012-12-01 65 views
1

我遇到了Json.Net的問題。只能序列化某個類的某些特定屬性?

我的應用程序連接到數據庫並在其中存儲一些數據。 讓我們假設我的應用程序有三個不同的類別:實體,集團,組織

短期看到實體類:

public class Entity 
{ 
    [JsonIgnore] 
    public int ID { get; private set; } 
    [JsonProperty] 
    public string UID { get; private set; } 
    [JsonProperty] 
    public Gender EntityGender { get; set; } 
    [JsonProperty] 
    public string Surname { get; set; } 
    [JsonProperty] 
    public string Forename { get; set; } 
    [JsonProperty] 
    public Group EntityGroup { get; set; } 
    [JsonProperty] 
    public Organisation EntityOrganisation { get; set; } 

組織和集團也有一個ID屬性。
序列化實體時,我不想完全序列化EntityGroup和EntityOrganisation,但只有它們的ID。

一些簡單的例子我怎麼會喜歡它的樣子:

(現在的樣子)

{ 
    "UID": "6c5204356b3a1a33", 
    "Surname": "Bar", 
    "Forename": "Foo", 
    "EntityGroup": { 
    "Name": "XGroup", 
    "GroupOrganisation": { 
     "Name": "FooOrg" 
    } 
    }, 
    "EntityOrganisation": null, 
    "EntityStation": null 
} 

(應該怎麼樣子)

{ 
    "UID": "6c5204356b3a1a33", 
    "Surname": "Bar", 
    "Forename": "Foo", 
    "EntityGroup": { 
    "ID": 1, 
    "GroupOrganisation": { 
     "ID": 1 
    } 
    }, 
    "EntityOrganisation": null, 
    "EntityStation": null 
} 

是否有可能設置一個只在序列化實體時序列化組和組織的ID屬性的JsonParser?

+0

當您反序列化時,您希望組織和組發生什麼事情? – tallseth

+0

我不會直接反序列化它。我將解析它並從數據庫加載相應的組織/組。 也許我會用另一種方式做,但這是我目前的想法:) – TorbenJ

+0

或者,也許我可以使用nick_w的解決方案來簡單地加載反序列化時的組織/組。 – TorbenJ

回答

2

這個怎麼樣:

在你Entity類中,JsonConverter屬性添加到EntityGroup類:

[JsonProperty] 
[JsonConverter(typeof(EntityGroupConverter))] 
public Group EntityGroup { get; set; } 

這將使用EntityGroupConverter序列化Group。這個類是如下:

class EntityGroupConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Group); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, 
     JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, 
     JsonSerializer serializer) 
    { 
     Group group = value as Group; 
     serializer.Serialize(writer, new { ID = group.ID, 
      GroupOrganisation = new { ID = group.Organisation.ID } }); 
    } 
} 

這裏的關鍵是使用serializer寫一個匿名對象只包括所需的性能。

請注意,ReadJson保持未實現 - 我假設在此階段不需要反序列化。

編輯

由於Skadier指出的那樣,ReadJson的簽名看起來像這樣在較新版本的Json.NET的(在這個問題上所使用的版本是3.5.0.0):

public override object ReadJson(JsonReader reader, Type objectType, 
     object existingValue, JsonSerializer serializer) 
+0

感謝它的工作! :)我只是不得不糾正你的ReadJson()方法,因爲參數不正確。 – TorbenJ

+1

@Skadier很高興爲你效勞!我已經編輯了我的回答,提及你關於'ReadJson'參數的觀點。 –