2017-02-21 12 views
0

私はこのような識別子を含むクラスを持っています。キー/配列ではなくJsonConverterのキー/値を書く方法

public class Type1 
{ 
    public int Id { get; set; } 
    // other properties 
} 

public class Type2 
{ 
    public int Id { get; set; } 
    // other properties 
} 

public class ParentType 
{ 
    [JsonConverter(typeof(IdConverter))] 
    public Type1 Instance1 { get; set; } 

    [JsonConverter(typeof(IdConverter))] 
    public Type2 Instance2 { get; set; } 
} 

私はJSONにParentTypeをシリアライズしたいが、私はクラス全体をシリアル化する必要はありません。インスタンスを一意に識別するため、Idだけが必要です。 IdConverterはこのように実装されています。

class IdConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     PropertyInfo pi = objectType.GetProperty("Id"); 
     return (pi != null && pi.PropertyType == typeof(int)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     JToken t = JToken.FromObject(value); 

     if (t.Type != JTokenType.Object) 
     { 
      t.WriteTo(writer); 
     } 
     else 
     { 
      int id = (int)value.GetType().GetProperty("Id").GetValue(value); 
      JObject o = JObject.FromObject(new { Id = id }); 
      o.WriteTo(writer); 
     } 
    } 
} 

これは問題なく動作しますが、出力Jsonは理想的にはフォーマットされていません。

{ 
    "Instance1": { 
    "Id": 1 
    }, 
    "Instance2": { 
    "Id": 2 
    } 
} 

私はこのように見えることをお勧めします。

{ 
    "Instance1": 1, 
    "Instance2": 2 
} 

これを実現する方法はありますか?

答えて

0

申し訳ありませんが、私はそれを自分で作成しました。

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    JToken t = JToken.FromObject(value); 

    if (t.Type != JTokenType.Object) 
    { 
     t.WriteTo(writer); 
    } 
    else 
    { 
     int id = (int)value.GetType().GetProperty("Id").GetValue(value); 
     writer.WriteValue(id); 
    } 
} 

結果;

{ 
    "Instance1": 1, 
    "Instance2": 2 
} 
関連する問題