Newtonsoft JSON - 如何在反序列化JSON时使用JsonConverter.ReadJson方法转换类型

时间:2016-07-26 09:58:49

标签: c# json.net json-deserialization

我需要帮助了解如何使用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#有点绿,只需帮助完成这项工作。

3 个答案:

答案 0 :(得分:17)

最后解决了;

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

不确定这是否是最佳解决方案,但它确实能够胜任。

答案 1 :(得分:3)

您可以在转换之前测试值类型。 你可以这样做:

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

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

答案 2 :(得分:1)

由于它是一个对象的基础,而你只是想要字符串,为什么不这样称呼它:

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