首页 > 解决方案 > 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# 模板的输出。

现在SsS1返回 null 值,它们应该分别返回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);

        }
    }

标签: c#jsonlistjson.net

解决方案


您要查找的信息嵌套在两个级别中,您必须访问响应对象然后访问数据对象,这应该有效:

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 块)。但是您需要在代码中添加它。


推荐阅读