2014-10-28 112 views
0

Newtonsoft.json似乎无法将int转换为我的nInt结构。我不知道为什么。我的结构的目的是允许INT设置为空,但实际上没有为null,而是默认为0。Newtonsoft.json将333错误转换为类型

这里是我的代码:

NINT:

/// <summary> 
/// Non-nullable int. Defaults to 0. 
/// </summary> 
public struct nInt 
{ 
    public nInt(int? value) 
     : this() 
    { 
     Value = value ?? 0; 
    } 

    private void deNullify() 
    { 
     Value = Value ?? 0; 
    } 

    public int? Value 
    { 
     get; 
     private set; 
    } 

    public static implicit operator nInt(int value) 
    { 
     return new nInt(value); 
    } 

    public static implicit operator nInt(int? value) 
    { 
     return new nInt(value); 
    } 

    public static implicit operator int?(nInt value) 
    { 
     return value.Value ?? 0; 
    } 

    public static implicit operator int(nInt value) 
    { 
     return value.Value ?? 0; 
    } 

    public override bool Equals(object other) 
    { 
     deNullify(); 
     return Value.Equals(other); 
    } 

    public override int GetHashCode() 
    { 
     deNullify(); 
     return Value.GetHashCode(); 
    } 

    public Type GetType() 
    { 
     return typeof(int?); 
    } 

    public int GetValueOrDefault(int defaultValue) 
    { 
     deNullify(); 
     return Value.GetValueOrDefault(defaultValue); 
    } 

    public bool HasValue 
    { 
     get { deNullify(); return Value.HasValue; } 
    } 

    public override string ToString() 
    { 
     deNullify(); 
     return Value.ToString(); 
    } 
} 

NINT使用:

public class TotalCountObject 
{ 
    public nInt totalCount { get; set; } 
} 

TotalCountObject tco = JsonConvert.DeserializeObject<TotalCountObject>(jsonString, jsonSerializerSettings); 
// here is where i get Error converting value 333 to type 'nInt'. 
+0

我会咬 - 可空已经定义了一个GetValueOrDefault()方法。 – 48klocs 2014-10-28 20:39:07

回答

4

您不需要创建自己的类型来执行此操作。您可以使用JSON.NET中的NullValueHandling选项忽略null对于非空类型。例如:

public class TotalCountObject 
{ 
    [JsonProperty(NullValueHandling = NullValueHanding.Ignore)] 
    public int totalCount { get; set; } 
} 

由于int的默认值是0,当这个属性被忽略,它的价值将为零。

您还可以在JsonSerializerSettings设置该属性:

var settings = new JsonSerializerSettings(); 
settings.NullValueHandling = NullValueHandling.Ignore; 

TotalCountObject tco = JsonConvert.DeserializeObject<TotalCountObject>(
    jsonString, jsonSerializerSettings); 

虽然这可能不是你想拿,如果你不希望NullValueHandling适用于所有性质的路线。

相关问题