Как обрабатывать DBnull при сериализации DataSets и DataTables в JSON с помощью JSON.NET

Я получаю следующую ошибку:

"StrongTypingException - значение столбца" {ColumnName} "в таблице" {TableName} "- DBNull."

когда я пытаюсь сериализовать DataTable с некоторыми нулевыми значениями в JSON с помощью JSON.NET.

Это код:

var dataSet= new DsGameInformatie();
var adapter = new GameTableAdapter();
adapter.FillByGameCategoryID(dataSet.Games, 1);
var settings = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    MissingMemberHandling = MissingMemberHandling.Ignore, 
    ObjectCreationHandling = ObjectCreationHandling.Replace, 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
    DefaultValueHandling = DefaultValueHandling.Ignore
};

return JsonConvert.SerializeObject(dataSet.Games, Formatting.None, settings);

Очевидно я что-то делаю не так. Я что-то упускаю? Как мне обработать эти значения DBNull, чтобы не получать исключения?


person Jeroen    schedule 14.11.2011    source источник
comment
Вероятно, вам придется сделать это в методе FillByGameCategoryID. Возможно, создайте там свою собственную функцию Convert для обработки нулей и возврата string.Empty. Какая строка вызывает вашу ошибку?   -  person Michael C. Gates    schedule 14.11.2011


Ответы (3)


Произошла ошибка, связанная с значениями NULL в таблицах данных, которая теперь исправлена ​​в Json.NET 4.0 Release 3.

См. Как я могу десериализовать таблицу данных ADO.NET, содержащую нулевые значения, с помощью Json.NET? и связанную проблему Null значения должны быть представлены как System.DBNull при десериализации DataTable.

person Frank    schedule 15.11.2011
comment
Я думаю, что это скорее ошибка в .NET, связанная с DBNull, которой теперь избегают в Json.NET? - person Bitterblue; 18.09.2013

Предполагая, что ваш DataSet исходит от конструктора DataSet, вы можете изменить способ обработки нулевых значений.

http://msdn.microsoft.com/en-us/library/ya91ataz(v=vs.80).aspx

person sq33G    schedule 14.11.2011
comment
Это очень полезно, это помогает для большинства значений, хотя я все еще получаю исключение для времени DateTime. Я не могу изменить обработку NullValue столбца с типом DateTime. Как я могу это обойти? - person Jeroen; 15.11.2011
comment
Я никогда не пробовал этого, но вы могли бы переместить свое свойство DateTime на другую сторону частичного класса DataSet. Попробую привести пример, когда я рядом с машиной с компилятором C #. - person sq33G; 15.11.2011

Это то, что я использую, и по умолчанию .Net хорошо справляется. Посмотрите, работает ли это для вас:

return Json(results, JsonRequestBehavior.AllowGet);

Просто передайте IEnumerable функции Json.

Надеюсь, это поможет.

person mithun_daa    schedule 14.11.2011
comment
Эй, я пробовал ваш подход, но мой компилятор не распознает Json и JsonRequestBehaviour - person Jeroen; 15.11.2011
comment
Вам нужно будет добавить using System.Web.Mvc, чтобы это работало. - person mithun_daa; 15.11.2011
comment
Я должен был сказать, что не использую MVC. Но я импортировал библиотеку System.Web.Mvc, теперь она распознает JsonRequestBehaviour, но все еще не распознает Json ( - person Jeroen; 15.11.2011
comment
Тогда это дает мне ошибку: не могу использовать здесь iternal метод Json;) Но я чувствую, что мы добираемся до цели. Спасибо за помощь до сих пор - person Jeroen; 15.11.2011
comment
Я сделал свой класс унаследованным от Controller, но теперь он возвращает JsonResult, и браузер выдает следующую ошибку: Uncaught Sys.Net.WebServiceFailedException: Sys.Net.WebServiceFailedException: серверный метод GetGames завершился неудачно со следующей ошибкой: - person Jeroen; 15.11.2011