1

我遇到了 Json.Net 的问题。

我的应用程序连接到数据库并在其中存储一些数据。假设我的应用程序具有三个不同的类:实体、组、组织

简要了解 Entity 类:

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
}

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

4

1 回答 1

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未实现 - 我假设在此阶段不需要反序列化。

编辑

正如 Skatier 所指出的,在ReadJsonJson.NET 的更新版本中,签名将如下所示(此问题中使用的版本是 3.5.0.0):

public override object ReadJson(JsonReader reader, Type objectType,
        object existingValue, JsonSerializer serializer)
于 2012-12-01T11:59:29.430 回答