2016-07-01 8 views
0

私はREST APIを呼び出してオブジェクトをResponseDataとして取得しています。Newtonsoft Json - Deserialize - プロパティ名が同じだがプロパティの型が異なる場合のカスタムマッピング

CustomField CustomFieldObj = JsonConvert.DeserializeObject<CustomField>(ResponseData.ToString()); 

//クラスdefination

public class ResposeData { 
    public string DataType {get; set;} 
    } 

さて、JsonConvert.DeserializeObjectがある

public class CustomField { 
public int? DataType {get; set;} 
} 

APIは、このようなオブジェクト持っている(DataTypeがタイプstringである)(DataTypeはタイプint?です)異なるデータ型のためにエラーをスローします(文字列はintに変換できません)。
デシリアライズ時にこれらのプロパティを異なるデータ型で無視するにはどうすればよいですか?

+0

JSON文字列と正確なエラーを投稿してください。ただし、someString123 "を整数に変換しようとすると、間違っています。 APIがそのフィールドを文字列ではなく数字にしたければ、数値としてシリアル化していました。たとえば、拡張機能や国際コードを省略すると、電話番号はintのように見えるかもしれませんが、intとして扱うことは間違いなくバグです。 –

+0

はい、まさにそれが起こります。特定のプロパティのマッピングをカスタマイズするにはどうすればよいですか? – JerryGoyal

+0

オブジェクトタイプを変更することはできません。デシリアライズ中に何らかの方法でカスタマイズする必要があります。このために渡すことができるパラメータはありますか? – JerryGoyal

答えて

0

複雑な答えは、デシリアライゼーションプロセスで使用するコンバータを指定することができます。JsonConverter

基本である、あなたは、基本クラスとしてJsonConverterを使用してこれらのプロパティをオーバーライドすることができます。

public class KeysJsonConverter : JsonConverter 
{ 
    private readonly Type[] _types; 

    public KeysJsonConverter(params Type[] types) 
    { 
     _types = types; 
    } 

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

     if (t.Type != JTokenType.Object) 
     { 
      t.WriteTo(writer); 
     } 
     else 
     { 
      JObject o = (JObject)t; 
      IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList(); 

      o.AddFirst(new JProperty("Keys", new JArray(propertyNames))); 

      o.WriteTo(writer); 
     } 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); 
    } 

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

    public override bool CanConvert(Type objectType) 
    { 
     return _types.Any(t => t == objectType); 
    } 
} 

これはジェームズ・ニュートン・キングからextractです。

JSONをオブジェクトに読み込む場合は、ReadJsonCanReadのメソッドをオーバーライドすることになります。

このコンバータがjsonを読み取ることを指定する場合は、CanReadメソッドをオーバーライドしてtrueを返します。

値を読み取るには、ReadJsonメソッドをオーバーライドする必要があります。

は、ReadJsonの実装方法に多少お答えしますが、リフレクションを使用することにご注意ください。

関連する問題