Json.NET,无法对可空类型进行反序列化

7wp*_*7wp 20 c# json json.net

我正在尝试使用Json.NET将JSON转换为C#对象.对象在C#中看起来像这样:

public class MyObject 
{
   public int? integerValue {get;set;}
   public DateTime? dateTimeValue {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行JsonConvert.DeserializeObject()传入的JSON时,我得到以下异常:

无法找到用于类型System.Nullable`1 [System.Int32]的构造函数.一个类应该具有默认构造函数或者只有一个带参数的构造函数.

---编辑----

事实证明,经过多次测试后,问题归结为我对JSON的输入是这样的:

{integerValue:{}, dateTimeValue: {} }
Run Code Online (Sandbox Code Playgroud)

代替:

{integerValue: null, dateTimeValue: null}
Run Code Online (Sandbox Code Playgroud)

事实证明,{}是一种在JSON中表示空对象的有效方式,但是在反序列化时,JSON.Net解析器不知道以与'null'相同的方式处理{}令牌.

谢谢各位的意见!

Pat*_*ick 15

该错误告诉您它无法找到可用于反序列化的构造函数.

尝试在类中添加默认构造函数:

public class MyObject
    {
        public int? integerValue { get; set; }
        public DateTime? dateTimeValue { get; set; }

        public MyObject(){}
    } 
Run Code Online (Sandbox Code Playgroud)

帕特里克.

- 编辑 -

所以我刚刚使用MyObject创建了一个简单的控制台应用程序,有或没有默认构造函数,我没有得到任何错误.这是我的例子:

   class Program
    {
        static void Main(string[] args)
        {
            var mo = new MyObject { integerValue = null, dateTimeValue = null };
            var ser = Newtonsoft.Json.JsonConvert.SerializeObject(mo);
            var deser = Newtonsoft.Json.JsonConvert.DeserializeObject(ser, typeof(MyObject));
        }
    }

    public class MyObject
    {
        public int? integerValue { get; set; }
        public DateTime? dateTimeValue { get; set; }        
    }  
Run Code Online (Sandbox Code Playgroud)

我没有例外......

你能展示一下你试图反序列化的JSON的例子吗?

  • 谢谢你的努力.我刚刚发现了问题所在.原来我的JSON输入sring {null而不是null值为空值.虽然{}在JSON中仍然有效,但JSON.Net转换器不理解以与null相同的方式处理{}. (2认同)

Kat*_*ina 11

我的解决方案是根据这个答案创建转换器

public class BoolConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((bool)value) ? 1 : 0);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value == null || reader.Value.ToString() == "False")
        {
            return false;
        }
        return true;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(bool);
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是在模型中指定

[JsonConverter(typeof(BoolConverter))]
public Boolean bold;
Run Code Online (Sandbox Code Playgroud)