Проблема десериализации JSon в DataTable при разборе DataType - PullRequest
0 голосов
/ 16 мая 2018

Когда я пытаюсь десериализовать JSon, значение столбца будет преобразовано из числа с плавающей точкой в ​​int.

Ниже Джсон: -

{{
  "ImportData": [
{ 
  "ProdName": "Pipes",
  "Qty": 11.3,
  "Rate": 610.3,
  "Discount": 20,
},
{ 
  "ProdName": "Drill Machine",
  "Qty": 12,
  "Rate": 400.3,
  "Discount": 10.3,
},
{
  "ProdName": "Cement",
  "Qty": 50,
  "Rate": 1110.5,
  "Discount": 15.5,
}
],
"TypeId": 1,
"SourceId": 1,
"CreatedBy": 35
}}

Я объявил настройки сериализатора Json для обработки поплавков ...

  JsonSerializerSettings settings = new JsonSerializerSettings
  {
    FloatParseHandling = FloatParseHandling.Decimal
  };

и укажите настройки при десериализации ...

 dt = JsonConvert.DeserializeObject<DataTable>(objParam["ImportData"].ToString(),settings);

dt output: -

ProdName        Qty   Rate     Discount
------------------------------------------------
Pipes           11.3  610.3    20
Drill Machine   12    400.3    10
cement          50    1110.5   15

ожидаемый результат: -

ProdName        Qty     Rate    Discount
------------------------------------------------
Pipes           11.3    610.3   20
Drill Machine   12      400.3   10.3
cement          50      1110.5  15.5

Может кто-нибудь подсказать мне, как решить эту проблему? Я просмотрел много постов, но не нашел рабочего решения.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я форматировал значения как числа с плавающей запятой, когда они являются числовыми значениями, используя javascript.

if (obj.DataType == 'numeric') {
  row[obj.SourceFieldName]=row[obj.SourceFieldName].toFixed(2);
}

@ vikscool спасибо, вы сэкономили много моего времени

0 голосов
/ 16 мая 2018

Проблема здесь в том, что DataTableConverter в Json.NET присваивает DataColumn.DataType из значений, присутствующих только в первой строке.

Именно поэтому ваши поля Кол-во и Норма отображаются правильно.

Я бы предложил использовать строго типизированный объект, соответствующий вашему JSON, а затем десериализовать его в него.

Вы также можете создать собственную реализацию DataTableConverter для того же самого, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...