当使用 Newtonsoft json.net 反序列化一个字符串时,如何将空字符串转换为可为空的整数类型(nullable int)的 null 值?

5
例如,如果我有

这样的代码。
public class MyClass
{
    public Int32? Id { get;set; }
    public string Description { get;set; }
}

我的JSON字符串看起来像这样:
"{\"Id\":\"\",\"Description\":\"test\"}"

我收到了一个错误信息:"无法将字符串转换为整数"。

3
那个值是一个字符串,你能修复一下JSON吗? - svick
另外,它对我来说确实有效,我没有收到任何错误。您能否发布重现问题的确切代码?您使用的是哪个版本的JSON.NET? - svick
1个回答

22

像svick所说的那样,你应该修复你的Json。但是如果它是外部Json,而你无法控制它,那么你可以使用JsonConverter。

public class StringToNIntConverter : JsonConverter
{

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(int?);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        if (reader.TokenType == JsonToken.Integer)
            return reader.Value;

        if (reader.TokenType == JsonToken.String)
        {
            if (string.IsNullOrEmpty((string)reader.Value))
                return null;
            int num;
            if (int.TryParse((string)reader.Value, out num))
                return num;

            throw new JsonReaderException(string.Format("Expected integer, got {0}", reader.Value));
        }
        throw new JsonReaderException(string.Format("Unexcepted token {0}", reader.TokenType));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(value);
    }
}

public class MyClass
{
    [JsonConverter(typeof(StringToNIntConverter))]
    public Int32? Id { get; set; }
    public string Description { get; set; }
}

返回 4.0.4 版本可以解决问题。现在可以传递可空整数的 null 值了。感谢大家的回复。 - user1286307
使用Json.NET 4.5版本时,我发现reader.Value返回的是一个长整型,因此我不得不将“return reader.Value;”更改为“return Convert.ToInt32(reader.Value);”。 - s1mm0t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接