web-dev-qa-db-ja.com

Newtonsoft JSON-JSONをデシリアライズするときにJsonConverter.ReadJsonメソッドを使用して型を変換する方法

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#について少し環境に優しいので、この作業を支援する必要があります。

10
ClaraU

ようやく解決しました。

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;
}

これが最良の解決策であるかどうかはわかりませんが、仕事はします。

22
ClaraU

変換する前に値の型をテストできます。あなたはこのようにそれを行うことができます:

if (reader.TokenType != JsonToken.String)
{
    throw new JsonSerializationException();
}

var value = serializer.Deserialize<string>(reader);
3

オブジェクトの基本なので、文字列が必要なだけなので、次のように呼び出してみてください。

 return new MyCustomType(reader.Value.ToString());
1
MoustafaS