c# Json 从来自 usgs url 的列表中获取值

c# Json get value from list sourced from usgs url

我需要帮助从 json 提取和 returning 值作为双精度值或字符串,两者都应该没问题。

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,
      ...
根据 VisualStudio 2019 grasshopper 开发人员 C# 模板,

url 定义为输入,SsS1 定义为输出。

现在 SsS1 return 空值,它们应该分别 return 1.8880.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 块)。但是你需要在你的代码中添加它。

您的数据为空,是因为您的需要Deserilize Json

使用 httpclientFactory

    var httpclient = _httpClientFactory.CreateClient();
    var responseDatas = await httpclient.GetAsync("https://earthquake.usgs.gov/ws/designmaps/asce7-16.json?latitude=34&longitude=-118&riskCategory=III&siteClass=C&title=Example");
    
  if (responseDatas.IsSuccessStatusCode)
    {
        var responseDatasJson = await responseDatas .Content.ReadAsStringAsync();
        var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
         var resultDataJson = JsonSerializer.Deserialize<Root>(responseDatasJson, options);
     return (resultDataJson);
    
     }

将 json 转换为 c# class 使用此站点 Json to c# class

或使用visual studio选项 编辑-->选择性粘贴-->粘贴Json为类

public class Data    {
        public double ss{ get; set; } 
        public double s1{ get; set; } 
       ....your properties
}
public class Response    {
        public Data data { get; set; } 
    }

    public class Root    {
    public Response response { get; set; } 
    }