如何将具有嵌套对象和嵌套集合的对象展平到 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; }

}

我正在读取一个反序列化为 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 中。