2017-02-21 172 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; } 
} 

我想序列化的ParentType到JSON,但我并不需要连载全班。我只需要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 
} 
相关问题