只序列化一个类的某些特定属性?

时间:2012-12-01 10:38:33

标签: c# serialization json.net

我遇到了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?

1 个答案:

答案 0 :(得分: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)