问题描述
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; }
}
我正在读取一个反序列化为 SomeObject
的 json 文件。目标是实现如下所示的数据框:
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[]
基本上,嵌套对象不会自动展平,如果是嵌套数组,它只会打印 namespace.classname[]
直到对象具有带有原语的简单结构为止,一切都很好。在我的情况下如何实现所需的数据帧结构?我是这个范式的绝对初学者,因此欢迎任何替代方法或建议。
解决方法
对数据框进行 ExpandColumns
操作,解决了您的部分问题。该操作将包含对象的所有列扩展为包含这些对象属性的多个列:
// Argument indicates how deep this should go
var expanded = df.Expand(1)
这会将 SomeOtherObject
展开为 SomeOtherObject.OtherObjectName
,但这不会处理数组(它不会将单行变成多行)。
对于数组,我认为没有任何好的内置解决方案(除了查看原始数据并对其进行操作)。所以我的建议可能是先使用其他工具将您的 JSON 数据转换为 CSV,然后将其加载到 Deedle 中。