如何将具有嵌套对象和嵌套集合的对象展平为 Deedle 数据框?

How to flatten an object with nested object and nested collection into Deedle dataframe?

我有以下 class 定义:

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 中。