2017-07-19 4 views
0

サードパーティAPIは特定の構造だけを受け入れるため、カスタムJSONコンバーターを使用しています。別のカスタムコンバーター内でコンバーターでenumをシリアル化する方法

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    var bodyRequest = (IRequest) value; 
    writer.WriteStartObject(); 
    writer.WritePropertyName(bodyRequest.RequestName); 
    writer.WriteStartObject(); 
    writer.WritePropertyName("-xmlns"); 
    writer.WriteValue("http://example.com"); 
    writer.WritePropertyName(bodyRequest.WrapperName); 
    writer.WriteStartObject(); 

    var contractResolver = new CamelCasePropertyNamesContractResolver { 
    IgnoreSerializableAttribute = false 
    }; 
    var properties = value.GetType().GetProperties(); 

    foreach(var propertyInfo in properties) { 
    if (HasAttribute(propertyInfo, typeof(JsonIgnoreAttribute))) { 
    continue; 
    } 
    var propValue = propertyInfo.GetValue(value);  
    var propertyName = contractResolver.GetResolvedPropertyName(propertyInfo.Name); 
    writer.WritePropertyName(propertyName); 
    writer.WriteValue(propValue); 

    } 
    writer.WriteEndObject(); 
    writer.WriteEndObject(); 
    writer.WriteEndObject(); 
} 

だから、私はその後、私はすべてのプロパティを取得し、それらをシリアライズ、WriteXXX方法の助けを借りてstrcutureを作成します。すべて正常に動作しますが、Enumを処理する必要があります。

public class ExampleRequest : IRequest 
{ 
    public long Id{ get; set; } 

    [JsonConverter(typeof(StringEnumConverter))] 
    public CarType CarType { get; set; } 

    public string RequestName => "Request"; 
    public string WrapperName => "SendData"; 
} 

public enum CarType 
{ 
    [EnumMember(Value = "NEW_CAR") 
    New, 
    [EnumMember(Value = "OLD_CAR") 
    Old 
} 

現在、シリアライズした後、私は私はリフレクションを使用してStringEnumConverterが無視されることを理解し、CarTypeが数値0または1を持っていることを参照してください。たとえば、我々は次の要求モデルを持っています。この場合、正しくシリアル化するにはどうすればよいですか?

答えて

1

ループ内で、プロパティにJsonConverterAttributeが適用されているかどうかを確認します。その場合は、コンバータの型を取得し、インスタンス化してから直接値を書き込むのではなく、WriteJsonメソッドを呼び出します。さもなければ、あなたが今やっているように値を書いてください。言い換えれば

、この行に置き換えます。これで

writer.WriteValue(propValue); 

を:

var att = propertyInfo.GetCustomAttribute<JsonConverterAttribute>(); 
if (att != null) 
{ 
    var converter = (JsonConverter)Activator.CreateInstance(att.ConverterType); 
    converter.WriteJson(writer, propValue, serializer); 
} 
else 
{ 
    writer.WriteValue(propValue); 
} 
+0

しようとします。ありがとう。 – user348173

関連する問題