仅序列化类的某些特定属性



我在 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 属性。
序列化实体时,我不想完全序列化实体组和实体组织,而只想序列化它们的 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
}

是否可以设置一个 JsonParser 在序列化实体时仅序列化组和组织的 ID 属性?

这个呢:

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)

相关内容

  • 没有找到相关文章

最新更新