2012-04-30 3 views
4

я получил объект, который может иметь следующие варианты:Выбор между двумя различными типами во время десериализации

"params": [23, 42] 
"params": {"minuend": 42, "subtrahend": 23} 

Как я могу сделать json.net автоматически создать object[] свойства для первого и Dictionary<string,object> собственности для второй?

Пример (окурок) Класс:

[DataContract] 
public class JsonRcpRequest 
{ 
    [DataMember(Name = "params")] 
    public object Parameters { get; set; } 
} 

ответ

3

Решение создать пользовательский JsonConverter со следующим способом:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    object source; 

    //[42, 23] 
    if (reader.TokenType == JsonToken.StartArray) 
    { 
     reader.Read(); 
     var values = new List<object>(); 
     while (reader.TokenType != JsonToken.EndArray) 
     { 
      values.Add(reader.Value); 
      reader.Read(); 
     } 

     reader.Read(); 
     source = values.ToArray(); 
    } 
    else if (reader.TokenType == JsonToken.StartObject)//{"subtrahend": 23, "minuend": 42} 
    { 
     reader.Read(); 
     var values = new Dictionary<string, object>(); 
     while (reader.TokenType != JsonToken.EndObject) 
     { 
      if (reader.TokenType != JsonToken.PropertyName) 
       throw new FormatException("Expected a property name, got: " + reader.TokenType); 
      string propertyName = reader.Value.ToString(); 
      reader.Read(); 

      values.Add(propertyName, reader.Value); 
      reader.Read(); 
     } 

     source = values; 
    } 
    else 
     throw new FormatException("Expected start of object or start of array"); 

    reader.Read(); 
    return source; 
} 

А потом пометить свойство с ним:

[DataMember(Name = "params", IsRequired = false)] 
[JsonConverter(typeof(ArgumentConverter))] 
public object[] Parameters { get; set; } 
Смежные вопросы