2012-12-01 66 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'参数的观点。 –