#c# #dataframe #deedle
Вопрос:
У меня есть следующие определения классов:
public class SomeObject {
public string Id { get; set; }
public string Name { get; set; }
public SomeOtherObject SomeOtherObject { get; set; }
public SomeAnotherObject[] SomeAnotherObjectArr { get; set; }
}
public class SomeOtherObject {
public string OtherObjectName { get; set; }
//other properties omitted for brevity
}
public class SomeAnotherObject {
public string AnotherObjectName { get; set; }
public bool Flag { get; set; }
}
Я читаю файл json, который десериализуется в SomeObject
. Цель состоит в том, чтобы создать фрейм данных, который выглядит следующим образом:
Id Name OtherObjectName AnotherObjectName Flag
1 Name1 OtherObjectName1 AnotherObjectName1 false
1 Name1 OtherObjectName1 AnotherObjectName2 true
Код, который я попробовал, это:
SomeObject someObject = GetDeserialisedJson();
var df = Frame.FromRecords(new [] { someObject });
df.Print();
Вывод, который он выводит, является:
Id Name SomeOtherObject SomeAnotherObjectArr
1 Name1 SomeOtherObject { OtherObjectName = someValue } Model.SomeAnotherObject[]
В принципе, вложенный объект не выравнивается автоматически, и в случае вложенного массива он просто выводит пространство имен.имя класса[]
До того момента, когда объект имеет простую структуру с примитивами, все в порядке. Как достичь требуемой структуры фрейма данных в моем случае? Я абсолютный новичок в этой парадигме, поэтому любые альтернативные подходы или предложения приветствуются.
Ответ №1:
Существует ExpandColumns
операция с фреймом данных, которая решает часть вашей проблемы. Операция расширяет все столбцы, содержащие объекты, на несколько столбцов, содержащих свойства этих объектов:
// Argument indicates how deep this should go
var expanded = df.Expand(1)
Это расширится SomeOtherObject
SomeOtherObject.OtherObjectName
, но это не касается массивов (это не превращает одну строку в несколько строк).
Для массивов я не думаю, что существует какое-либо хорошее встроенное решение (кроме простого просмотра необработанных данных и управления ими). Поэтому я, вероятно, рекомендовал бы использовать какой-нибудь другой инструмент, чтобы сначала преобразовать ваши данные JSON в CSV, а затем загрузить их в Deedle.
Комментарии:
1. Да, перемещение json в CSV — лучший вариант.