Неправильная сериализация json.net - PullRequest
0 голосов
/ 20 ноября 2018

У меня проблемы с сериализацией графа объектов с помощью NewtonSoft JsonConvert.Dapper может работать двумя способами: метод Query(string sql[, object args]) может возвращать IEnumerable<dynamic> или универсальный метод Query<T>(string sql[, object args]) может возвращать IEnumerable<T>

Он работает, когда я не типарезультат:

stringifiedDynamicData
[{"Record_Key":2,"Factory_Key":7,"EnteredAt":"2018-11-20T09:03:03.374",...}]

Когда я указываю тип для результата, результаты выглядят следующим образом:

stringifiedTypedData
[{}]

Вот код, приведший выше.

IDbConnection syb = new OdbcConnection(connectionstring);
var sql = System.IO.File.ReadAllText("./powerbi.sybase");
var typedData = syb.Query<Status>(sql);
var stringifiedTypedData = JsonConvert.SerializeObject(typedData); 
Console.WriteLine("stringifiedTypedData");
Console.WriteLine(stringifiedTypedData);
var dynamicData = syb.Query(sql);
var stringifiedDynamicData = JsonConvert.SerializeObject(dynamicData);
Console.WriteLine("stringifiedDynamicData");
Console.WriteLine(stringifiedDynamicData);      

Проверка отладки переменной typedData выявляет коллекцию Status объектов с одним элементом, как и ожидалось.Поля имеют ожидаемые значения, поэтому было немного удивительно, когда JsonConvert.Deserialize(typedData) вернул [{}]

Добавление этого значения

  var foo = new {
    A = "wibble", B = 6
  };
  IEnumerable<object> bar = from x in new object[] { foo } select x;
  var quux = JsonConvert.SerializeObject(bar);
  Console.WriteLine("quux");
  Console.WriteLine(quux);

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

quux
[{"A":"wibble","B":6}]

, что подразумевает проблему с данными.так что это не какая-то проблема конфигурации.

Класс Status имеет эту форму.

public class Status
{
  float AdtechAmt { get; set; } = -1;
  float AssemblyError { get; set; } = -1;
  string CutToFinish_Avg { get; set; } = "-1";
  ...
}

Я только что добавил значения по умолчанию, чтобы увидеть, имеет ли это значение(нет).

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

1 Ответ

0 голосов
/ 20 ноября 2018

По сути, это ошибка программиста Bonehead, с поворотом Typescript.

И C #, и Typescript поддерживают свойства без модификатора.Но хотя неизмененные свойства Typescript по умолчанию являются открытыми, в C # они по умолчанию защищены.Поскольку для класса не требуется наличие общедоступных свойств, статическая ошибка компилятора не возникает.

Dapper использует отражение и может видеть защищенные элементы, успешно сопоставляет их с полями набора данных и заполняет их.Успешное использование Dapper класса для ввода результатов еще больше маскирует неспособность сделать свойства общедоступными.

Первый видимый эффект - сериализация без свойств.Причина, по которой нет исключений, заключается в том, что все объекты (в данном случае одна строка) были успешно сериализованы, и все открытые свойства (нет) представлены в строке JSON.

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