私はこの質問のためのstackoverflowに他のいくつかの結果があることを確認しますが、動作していないか、あいまいです。JSON.NETを使用して、時にはオブジェクトであり、時にはオブジェクトの配列である値を処理するにはどうすればよいですか?
問題は、JSONが戻ってきて自分のカスタムタイプの1つにシリアル化されているときに、JSONのビットの1つが配列になることがあります。文字列。カスタムタイプに文字列があり、JSONが配列の場合、エラーが発生します。 JSONがオブジェクトであり、カスタムタイプが配列の場合も同じことが起こります。それをプロパティにマップすることはできません。
私はこれを解決することにしました。私はこの特定のプロパティの非直列化をオーバーライドしたいと思います。それがオブジェクトであれば、それを1オブジェクトの配列に変換したいと思います。
私が連載中のオブジェクトでは、非直列化の方法をオーバーライドすると思われるJsonConverterを追加しました。
[JsonConverter(typeof(ArrayOrSingleObjectConverter<string>))]
public List<string> person { get; set; }
カスタムコンバーターは、単一のオブジェクトを配列に変換するという考えがあります。したがって、JSONが "Hello"の場合、文字列をListに変換できないという例外をスローするのではなく、 "Hello"を含むListをPersonに設定します。
既に配列の場合は、それをそのままにしておく必要があります。
コンバータは、次のようになります。
public class ArrayOrSingleObjectConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true; // Not sure about this but technically it can accept an array or an object, so everything is game.
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType == typeof(List<T>))
{
return serializer.Deserialize<List<T>>(reader);
}
else
{
var singleObject = serializer.Deserialize<T>(reader);
var objectAsList = new List<T>();
objectAsList.Add(singleObject);
return objectAsList;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
それは動作しません。上記のコードでは、単一の文字列を逆シリアル化しようとすると例外がスローされ、if文内のListにキャストできないことが示されています( 'objectype'はListです)。
私は、読み取りと書き込みの方法が何をしているのかを正確に理解するのに苦労しています。 stackoverflowのもう一つの答えでは、readメソッドにNotImplementedException
を投げることを示唆しています。しかし、それを行うと、readメソッドが呼び出され、例外がスローされます。
私は正しい軌道に乗っていると思っていますが、正しい方向にナッジが必要です。私は、ReadJSonメソッドが何をしているのか、そのパラメータが何を意味しているのか少し混乱していると思います。
Deserializeメソッド呼び出しで値を指定しなかったため、値がどこから来ているのか分かりません。
私はこの1つの私の深さのビットです。
「変数」オブジェクトを「System.Object」にデシリアライズできませんか?あなたはランタイムのタイプをチェックし、あなたのことをすることができます。 –