1

Json.Netで問題が発生しました。

私のアプリケーションはデータベースに接続されており、その中にいくつかのデータが保存されています。私のアプリケーションには、エンティティ、グループ、組織の3つの異なるクラスがあると仮定します。

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
}

エンティティをシリアル化するときに、グループと組織のIDプロパティのみをシリアル化するJsonParserをセットアップすることは可能ですか?

4

1 に答える 1

2

これはどうですか:

クラスで、属性をEntityクラスに追加します。JsonConverterEntityGroup

[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)
于 2012-12-01T11:59:29.430 に答える