2017-02-17 84 views
0

在我的API,我想給消費者發送屬性作爲一個字符串標識符或對象的選項,例如:基於JSON令牌類型有條件反序列化屬性

{ 
    "source": "token_xyz" 
} 

或者

{ 
    "source": { 
     "name": "test" 
    } 
} 

根據類型(字符串或對象),我想設置我的類中的特定屬性:

public class MyRequest 
{  
    [JsonProperty("source")] 
    public SourceUser SourceUser { get; set; } 

    [JsonProperty("source")] 
    public string SourceToken { get; set; } 
} 

正如你所看到的,我嘗試用JsonProperty("source")裝飾兩個屬性,但不幸的是這不起作用 - 對象無法反序列化。

如何反序列化到基於JSON類型的相應屬性?

回答

1

Json.NET不支持具有相同的合同屬性名的兩個屬性,可能是因爲,在解釋JSON RFC

他們的名字都是獨特的是在這個意義上 所有互操作的對象接收該對象的軟件實現將同意 名稱 - 值映射。當一個對象中的名字不是唯一的時候,接收這樣的對象的軟件的行爲是 不可預知的。

因此,您將需要某種custom JsonConverter來反序列化您的"source"屬性。一個簡單的方法做,這是轉換器適用於私人Source屬性,設置&得到任何SourceUserSourceToken酌情:

public class MyRequest 
{ 
    [JsonConverter(typeof(SourceConverter))] 
    [JsonProperty] 
    object Source 
    { 
     get 
     { 
      // Possibly throw an exception if both are non-null? 
      return SourceUser ?? (object)SourceToken; 
     } 
     set 
     { 
      SourceUser = value as SourceUser; 
      SourceToken = value as string; 
     } 
    } 

    [JsonIgnore] 
    public SourceUser SourceUser { get; set; } 

    [JsonIgnore] 
    public string SourceToken { get; set; } 
} 

class SourceConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException("This converter is intended to be applied with [JsonConverter(typeof(SourceConverter))]"); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     else if (reader.TokenType == JsonToken.StartObject) 
      return serializer.Deserialize<SourceUser>(reader); 
     else 
      return (string)JValue.Load(reader); 
    } 

    public override bool CanWrite { get { return false; } } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

樣品fiddle

相關問題