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);
我在将此请求的 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);