C# 从 JSON 响应创建 Deedle DataFrame

C# Create Deedle DataFrame from JSON response

我在将此请求的 JSON 响应加载到 Deedle DataFrame 时遇到了一些问题:https://sampleserver6.arcgisonline.com/arcgis/rest/services/Earthquakes_Since1970/FeatureServer/0/query?where=OBJECTID%3C10&returnGeometry=false&f=json

在JSON中,我感兴趣的是功能。更具体地说,对于每个功能都有属性——我基本上只想将这些属性的集合加载到 DataFrame 中。在这种特殊情况下,只有一个属性 "name" 所以我的期望是生成的 DataFrame 将有一列 "name",其中显示了值。

我试过使用 json2csharp 并创建自己的 class,但结果要么没有列 header/values,要么缺少值。我不太确定我做错了什么,或者我是否以正确的方式处理这个问题。我从 Deedle 文档中了解到,应该可以从对象集合创建 DataFrame:https://bluemountaincapital.github.io/Deedle/csharpframe.html#Creating-and-loading-data-frames。当然,使用页面上列出的 Enumerable 示例可以正常工作。

这是我的代码的相关部分:

        string url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Earthquakes_Since1970/FeatureServer/0/query?";
        WebClient wc = new WebClient();

        wc.QueryString.Add("where", "OBJECTID<10");
        wc.QueryString.Add("returnGeometry", "false");
        wc.QueryString.Add("f", "json");
        var data = wc.UploadValues(url, "POST", wc.QueryString);

        var responseString = UnicodeEncoding.UTF8.GetString(data);
        JObject o = JObject.Parse(responseString);
        dynamic x = JsonConvert.DeserializeObject(responseString);
        var testObjList = new List<dynamic>();
        foreach (dynamic element in x.features)
            {

                testObjList.Add(new myClass { name = element.attributes.name});

                Console.WriteLine($"{element.attributes.name}");
            }


        var dfObjects = Frame.FromRecords(testObjList);
        dfObjects.Print();
        var df = Frame.FromRecords(test);
        df.Print(); // No headers or values shown

myClass 就是这个:

   public class myClass{

        public string name { get; set; }

    }

任何 help/pointers 将不胜感激!

Frame.FromRecords 操作依赖于静态类型信息来确定 class 具有哪些属性。在您的情况下,您将对象列表定义为 List<dynamic> - 这被编译为 Object 因此 Deedle 看不到任何成员。

要解决此问题,您需要做的就是将类型定义为 myClass 个对象的列表:

var testObjList = new List<myClass>();

使用匿名类型的更紧凑的方法也可以:

var testObjList =       
  ((IEnumerable<dynamic>)x.features).Select(element => 
    new { name = element.attributes.name });
var dfObjects = Frame.FromRecords(testObjList);