我在将此请求的 JSON 响应加载到 Deedle DataFrame 中时遇到了一些问题:
在 JSON 中,我感兴趣的是它的特性。更具体地说,对于每个功能都有属性 - 我本质上只想将这些属性的集合加载到 DataFrame 中。在这种特殊情况下,只有一个属性“名称”,因此我的期望是生成的 DataFrame 将具有一列“名称”,其中显示了值。
我尝试使用 json2csharp 并创建自己的类,但结果要么没有列标题/值,要么缺少值。我不太确定我做错了什么,或者我是否以正确的方式处理这个问题。我对 Deedle 文档的理解是,应该可以从对象集合创建 DataFrame:https://bluemountaincapital.github.io/Deedle/csharpframe.html#Creating-and-loading-data-frames 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; }
}
任何帮助/指示将不胜感激!
The Frame.FromRecords
操作依赖于静态类型信息来确定该类具有哪些属性。在您的情况下,您将对象列表定义为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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)