複雑な答えは、デシリアライゼーションプロセスで使用するコンバータを指定することができます。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をオブジェクトに読み込む場合は、ReadJson
とCanRead
のメソッドをオーバーライドすることになります。
このコンバータがjsonを読み取ることを指定する場合は、CanRead
メソッドをオーバーライドしてtrueを返します。
値を読み取るには、ReadJson
メソッドをオーバーライドする必要があります。
は、ReadJson
の実装方法に多少お答えしますが、リフレクションを使用することにご注意ください。
JSON文字列と正確なエラーを投稿してください。ただし、someString123 "を整数に変換しようとすると、間違っています。 APIがそのフィールドを文字列ではなく数字にしたければ、数値としてシリアル化していました。たとえば、拡張機能や国際コードを省略すると、電話番号はintのように見えるかもしれませんが、intとして扱うことは間違いなくバグです。 –
はい、まさにそれが起こります。特定のプロパティのマッピングをカスタマイズするにはどうすればよいですか? – JerryGoyal
オブジェクトタイプを変更することはできません。デシリアライズ中に何らかの方法でカスタマイズする必要があります。このために渡すことができるパラメータはありますか? – JerryGoyal