При использовании newtonsoft json.net для десериализации строки, как мне преобразовать пустую строку в null для nullable int? - PullRequest
5 голосов
/ 22 марта 2012

Например, если у меня есть

public class MyClass
{
    public Int32? Id { get;set; }
    public string Description { get;set; }
}

и моя строка json выглядит так:

"{\"Id\":\"\",\"Description\":\"test\"}"

Я получаю сообщение об ошибке "Не удалось преобразовать строку в целое число"

1 Ответ

18 голосов
/ 26 марта 2012

Как сказал 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; }
}
...