在反序列化数据

时间:2017-01-10 07:27:38

标签: c# asp.net-mvc linq json.net

我将json字符串发布到我的方法,并在反序列化到我的类时收到错误。

错误

  

将值-1转换为类型' System.Nullable`1 [System.UInt64]'时出错。   Path' MyMappings 1。MySqlColumns [7] .size'。内在例外:{"价值   对于UInt64来说太大或太小。"}

下面是我要在反序列化json值后输出的类:

public class MyMappings
   {
       public string Name { get; set; }
       public List<MysqlColumns> MySqlColumns { get; set; }
   }

public class MySqlColumns
    {
        public string Column { get; set; }
        public string Datatype { get; set; }
        public string IsNullable { get; set; }
        public UInt64? Size { get; set; }
        public UInt64? NumericPrecision { get; set; }
        public UInt64? NumericScale { get; set; }
    }

string myJson =  "MyMappings": [
    {
      "Name": "dbo.Table1",
      "MySqlColumns": [
        {
          "Name": "Address",
          "datatype": "nvarchar",
          "isNullable": "YES",
          "size": -1,
          "numericPrecision": null,
          "numericScale": null
        }]

var deserializeData = JsonConvert.DeserializeObject<MyMappings>(myJson);

现在,当用户为任何列设置nvarchar(max)时,我将size设置为-1,这是setinel值以表示最大大小。现在将size设置为-1的原因是因为在读取大小为nvarchar(max)的列时,我的setinel值为-1 Marc Gravell's comment

我见过这个answer,但我的问题是如何在反序列化时使用它。我正在使用NewtonSoft json

更新

将尺寸指定为uint的原因:

enter image description here

2 个答案:

答案 0 :(得分:3)

类型名称中的U代表无符号,即这些值始终为正。所以值-1太小而不能存储在这样的变量中。将您的类型更改为已签名的Int64。或者使用null作为最大标记,并在创建列时将其解释为相应的。

至于你的更新,你唯一能做的就是使用null并让你的逻辑在需要时将其解释为-1。因为很难过你不能吃蛋糕并同时吃它。

答案 1 :(得分:1)

我会在MySqlColumns类中添加新属性(bool)。让我们把它命名为MaxLength。这将用作最大值标记。如果您的数据类型是nvarchar,varchar或任何其他类型,您可以查看此属性,您可以在其中定义长度。