2012-02-13 22 views
0

我想使用JSON.net将JSON加载到SQL数据库中。JSON麻烦;反序列化到数据表

我对其他JSON响应没有问题,但以下格式似乎没有正确的反序列化。

{"Report":["2012m01d01","2012m01d02","2012w01","2012m01","2012m01d03","2012m01d04","2012m01d05","2012m01d06","2012m01d07","2012m01d08"], 
"Realtime":null} 

有没有人可以提供一些洞察,为什么这将是?我正在使用以下代码进行反序列化。

public void Deserialize(String jsonText, ref DataTable dt) 
     { 
      JsonSerializer json = new JsonSerializer(); 
      json.NullValueHandling = NullValueHandling.Ignore; 
      json.ObjectCreationHandling = ObjectCreationHandling.Replace; 
      json.MissingMemberHandling = MissingMemberHandling.Ignore; 
      json.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
      StringReader sr = new StringReader(jsonText); 
      JsonTextReader reader = new JsonTextReader(sr); 
      dt = (DataTable)json.Deserialize(reader, typeof(DataTable)); 

      reader.Close(); 
     } 

有什么想法解决这个问题的最佳方法是什么?这适用于其他JSON响应!

在此先感谢

+3

“下面的格式似乎不正确的反序列化”你收到任何错误或结果不是预期的?什么错误和结果?你能举一些例子,它工作正常吗? – 2012-02-13 16:43:49

+0

如果您使用.NET 4.0,那么这里有一个链接可以帮助您解决问题。http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and- dynamic-to-parse-json.aspx – MethodMan 2012-02-13 16:53:58

+0

它不会生成任何错误,不幸的是。它似乎并没有反序列化。以下反序列罚款虽然。 [{ “帐户ID”:1, “概要文件”:空, “姓名”: “页数”, “ID”: “18d039ae0360”, “语言”:空, “类型”:空, “类别”:NULL,“IsHierarchy “:false,”IntervalsEnabled“:true,”IsRealtimeCompatible“:true,”properties“:null},(依此类推) – user1207242 2012-02-14 07:47:59

回答

0

JSON是能够保持hirarchial信息,即没有转化为一个DataTable,而是分成几个使用DataSet和表之间的关系。

我把你的JSON在http://jsonlint.com验证和格式化

你说的这种反序列化,没有任何问题

{ 
    "accountID": 1, 
    "profileID": null, 
    "name": "Pages", 
    "ID": "18d039ae0360", 
    "language": n‌​ull, 
    "type": null, 
    "Category": null, 
    "IsHierarchy": false, 
    "IntervalsEnabled": true, 
    "IsRe‌​altimeCompatible": true, 
    "properties": null 
} 

这是一个单一的对象

但这并不正确反序列化。

{ 
    "Report": [ 
     "2012m01d01", 
     "2012m01d02", 
     "2012w01", 
     "2012m01", 
     "2012m01d03", 
     "2012m01d04", 
     "2012m01d05", 
     "2012m01d06", 
     "2012m01d07", 
     "2012m01d08" 
    ], 
    "Realtime": null 
} 

其实你的问题是数据处理不serializion

首先是一个单一的对象,它可以反序列化到一个DataTable ,另一个是保存到报表对象列表的引用的对象。

因此,你需要从你的对象转换器手动写入到两个DataTable

此代码的工作,我敢肯定,你可以为你的两个表

  var settings = new JsonSerializerSettings 
     { 

      MissingMemberHandling = MissingMemberHandling.Error, 
      NullValueHandling = NullValueHandling.Include 

     }; 
     JsonSerializer json = JsonSerializer.Create(settings); 

     json.Error += (x, y) => 
     { 
      var s = y.ErrorContext; 
      var t = y.CurrentObject; 

     }; 

     StringReader sr = new StringReader(jsonString); 
     JsonTextReader reader = new JsonTextReader(sr); 


     var o = json.Deserialize<ClsReport>(reader); 

     string sf = o.ReportItems[2]; 

希望这会创建一个转换功能帮助