从 JSON 响应中检索元素

Retrieving an element from JSON response

我正在尝试从我们正在构建的 Web API 中的其余服务的响应中获取一个字段。 JSON 看起来像这样:

{
"d": {
    "results": [{
        "__metadata": {
            "id": "Web/Lists(guid'4ddc-41e2-bb44-0f92ad2c0b07')/Items(164)",
            "uri": "https://teams.ax.org/sites/js/project/_api/Web/Lists(guid'4ddc-41e2-bb44-0f92ad2c0b07')/Items(164)",
            "etag": "\"6\"",
            "type": "SP.Data.St_x0020_CdsListItem"
        },
        "Folder": {
            "__deferred": {
                "uri": "https://teams.ax.org/sites/js/project/_api/Web/Lists(guid'4ddc-41e2-bb44-0f92ad2c0b07')/Items(164)/Folder"
            }
        },
        "ParentList": {
            "__deferred": {
                "uri": "https://teams.ax.org/sites/js/project/_api/Web/Lists(guid'4ddc-41e2-bb44-0f92ad2c0b07')/Items(164)/ParentList"
            }
        },
        "PM_x0020_NameId": 220,
        "St_x0020_Name": "<div class=\"ExternalClassA14DB0FF86994403B827D91158CF34B0\">KO</div>",
    }]
}}

我创建了这些模型 类:

 public class SharepointDTO
 {
    public class Metadata
    {
        [JsonProperty("id")]
        public string id { get; set; }

        [JsonProperty("uri")]
        public string uri { get; set; }

        [JsonProperty("etag")]
        public string etag { get; set; }

        [JsonProperty("type")]
        public string type { get; set; }
    }

    public class Deferred
    {
        [JsonProperty("uri")]
        public string uri { get; set; }
    }

    public class Folder
    {
        [JsonProperty("__deferred")]
        public Deferred __deferred { get; set; }
    }

    public class ParentList
    {
        [JsonProperty("__deferred")]
        public Deferred __deferred { get; set; }
    }

    public class Result
    {
        [JsonProperty("__metadata")]
        public Metadata __metadata { get; set; }

        [JsonProperty("Folder")]
        public Folder Folder { get; set; }

        [JsonProperty("ParentList")]
        public ParentList ParentList { get; set; }

        [JsonProperty("PM_x0020_NameId")]
        public int PM_x0020_NameId { get; set; }

        [JsonProperty("St_x0020_Name")]
        public string St_x0020_Name { get; set; }
    }

    public class D
    {
        [JsonProperty("results")]
        public IList<Result> results { get; set; }
    }

    public class RootObject
    {
        [JsonProperty("d")]
        public D d { get; set; }
    }
}

不要尝试从 Web API 调用其余服务,需要从响应中获取 St_x0020_Name 并存储在字符串中。

  SharepointDTO.RootObject retSharepointobj = await GetfromSharepoint(StNumber);
  string StName = retSharepointobj.d.results.St_x0020_Name.ToString();

我正在反序列化 GetfromSharepoint 方法中的 JSON,例如

using (var client_sharePoint = new HttpClient(handler))
{
    var response = client_sharePoint.GetAsync(SP_URL).Result;

    var responsedata = await response.Content.ReadAsStringAsync();
    var returnObj = JsonConvert.DeserializeObject<SharepointDTO.RootObject>(responsedata);

    return returnObj;
}

但是它抛出一个错误:

'System.Collections.Generic.IList' does not contain a definition for 'St_x0020_Name' and no extension method 'St_x0020_Name' accepting a first argument of type 'System.Collections.Generic.IList' could be found (are you missing a using directive or an assembly reference?)

这一行不应该:

string StName = retSharepointobj.d.results.St_x0020_Name.ToString();

会这样吗?

string StName = retSharepointobj.d.results.First().St_x0020_Name.ToString();

results 是一个数组,所以你可以像

这样循环
foreach(var item in retSharepointobj.d.results){
   string StName = item.St_x0020_Name.ToString();
}

或获取特定元素,例如第一个元素,如:

SharepointDTO.RootObject retSharepointobj = await GetfromSharepoint(StNumber);
string StName = retSharepointobj.d.results[0].St_x0020_Name.ToString();

或者您可以像那样添加额外的支票

SharepointDTO.RootObject retSharepointobj = await GetfromSharepoint(StNumber);
if(retSharepointobj.d.results.length > 0){
    string StName = retSharepointobj.d.results[0].St_x0020_Name.ToString();
}