JsonConverter.ReadJsonメソッドを使用して、任意の数の型(文字列、ブール、日付、整数、配列、オブジェクト)の値を特定のカスタム型に変換する方法を理解する助けが必要です。
たとえば、次のものがあります。
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//where reader.Value could be a string, boolean, Date, int, array, object
//and in this example the value of reader.Value is a string
return new MyCustomType(reader.Value);
}
しかし、これはエラーになります。
Compilation error (line 115, col 36): Argument 1: cannot convert from 'object' to 'string'
私はC#について少し環境に優しいので、この作業を支援する必要があります。
ようやく解決しました。
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
MyCustomType myCustomType = new MyCustomType();//for null values
if (reader.TokenType != JsonToken.Null)
{
if (reader.TokenType == JsonToken.StartArray)
{
JToken token = JToken.Load(reader);
List<string> items = token.ToObject<List<string>>();
myCustomType = new MyCustomType(items);
}
else
{
JValue jValue = new JValue(reader.Value);
switch (reader.TokenType)
{
case JsonToken.String:
myCustomType = new MyCustomType((string)jValue);
break;
case JsonToken.Date:
myCustomType = new MyCustomType((DateTime)jValue);
break;
case JsonToken.Boolean:
myCustomType = new MyCustomType((bool)jValue);
break;
case JsonToken.Integer:
int i = (int)jValue;
myCustomType = new MyCustomType(i);
break;
default:
Console.WriteLine("Default case");
Console.WriteLine(reader.TokenType.ToString());
break;
}
}
}
return myCustomType;
}
これが最良の解決策であるかどうかはわかりませんが、仕事はします。
変換する前に値の型をテストできます。あなたはこのようにそれを行うことができます:
if (reader.TokenType != JsonToken.String)
{
throw new JsonSerializationException();
}
var value = serializer.Deserialize<string>(reader);
オブジェクトの基本なので、文字列が必要なだけなので、次のように呼び出してみてください。
return new MyCustomType(reader.Value.ToString());