c# - c# Json 从来自 usgs url 的列表中获取值
问题描述
我需要帮助从 json 中提取和返回值作为双精度值或字符串,两者都应该没问题。
正在使用它的 URL:<https://earthquake.usgs.gov/ws/designmaps/asce7-16.json?latitude=34&longitude=-118&riskCategory=III&siteClass=C&title=Example>
这是json
{
"request": {
"date": "2021-01-30T19:07:52.176Z",
"referenceDocument": "ASCE7-16",
"status": "success",
"url": "https://earthquake.usgs.gov/ws/designmaps/asce7-16.json?latitude=34&longitude=-118&riskCategory=III&siteClass=C&title=Example",
"parameters": {
"latitude": 34,
"longitude": -118,
"riskCategory": "III",
"siteClass": "C",
"title": "Example"
}
},
"response": {
"data": {
"pgauh": 0.819,
"pgad": 1.021,
"pga": 0.819,
"fpga": 1.2,
"pgam": 0.983,
"ssrt": 1.888,
"crs": 0.896,
"ssuh": 2.106,
"ssd": 2.432,
"ss": 1.888,
"fa": 1.2,
"sms": 2.265,
"sds": 1.51,
"sdcs": "D",
"s1rt": 0.669,
"cr1": 0.9,
"s1uh": 0.743,
"s1d": 0.963,
"s1": 0.669,
"fv": 1.4,
"sm1": 0.936,
"sd1": 0.624,
"sdc1": "D",
"sdc": "D",
"tl": 8,
"t-sub-l": 8,
"cv": 1.278,
...
url 被定义为输入,Ss
并且S1
被定义为每个 VisualStudio 2019 蚱蜢开发者 C# 模板的输出。
现在Ss
并S1
返回 null 值,它们应该分别返回1.888
和0.669
。
using Grasshopper.Kernel;
using System;
using System.Net;
using Newtonsoft.Json.Linq;
protected override void SolveInstance(IGH_DataAccess DA)
{
string url = "";
DA.GetData(0, ref url);
using (WebClient wc = new WebClient())
{
var json = wc.DownloadString(url);
JObject jObj = JObject.Parse(json); // Parse the object graph
string Ss = (string)jObj["ss"];
string S1 = (string)jObj["s1"];
//Functions I also tried
//var data = jObj["data"];
//foreach (var d in data) ;
//var Ss = d["ss"];
//double Ss = jObj.GetValue("ss").ToObject<double>();
//string Ss = jObj.GetValue("ss").Value<string>();
//string Ss = jObj.GetValue("ss").ToString();
//string Ss = jObj["ss"].ToString();
DA.SetData(0, Ss);
DA.SetData(1, S1);
}
}
解决方案
您要查找的信息嵌套在两个级别中,您必须访问响应对象然后访问数据对象,这应该有效:
var json = wc.DownloadString(url);
JObject jObj = JObject.Parse(json); // Parse the object graph
var data = jObj["response"]["data"];
var ss = data["ss"].ToObject<double>(); // or .ToString() if you want the string value
var s1 = data["s1"].ToObject<double>(); // or .ToString() if you want the string value
DA.SetData(0, ss);
DA.SetData(1, s1);
注意:为简单起见,此代码缺少空值检查和错误处理(try-catch 块)。但是您需要在代码中添加它。
推荐阅读
- python - 如何在 Python 3 中使用 klepto sqltable_archive 设置表名?
- javascript - 处理单元格点击 - Google 电子表格 - Appscript
- java - 如何从另一台电脑的客户端连接到我自己机器上的服务器?
- css - CSS不会显示背景图片?
- r - R 中 brms 条件效应的平均结果
- python - Ray 对象存储使用 out of core 耗尽内存。如何配置像 s3 存储桶这样的外部对象存储?
- python - 在模板中放置类别以下的项目
- haskell - 在多种数据类型上使用 System.Random - Haskell 方式?
- javascript - 将项目添加到特定索引处的嵌套数组
- bootstrap-4 - 自定义 scss 不会覆盖引导程序