代码之家  ›  专栏  ›  技术社区  ›  xyz

从JSON响应中检索元素

  •  0
  • xyz  · 技术社区  · 8 年前

    我试图从我们正在构建的Web API中的rest服务的响应中获得一个字段。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调用rest服务,需要从响应中获取St\u x0020\u名称并存储在字符串中。

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

    enter image description here

    我正在反序列化 GetfromSharepoint 类似方法

    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;
    }
    

    但它抛出了一个错误:

    '系统。收藏。通用的“IList”不包含“St\u x0020\u Name”的定义,并且没有扩展方法“St\u x0020\u Name”接受“System”类型的第一个参数。收藏。通用的可以找到IList(您是否缺少using指令或程序集引用?)

    2 回复  |  直到 8 年前
        1
  •  1
  •   Pavel Kovalev    8 年前

    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();
    }
    
        2
  •  0
  •   FailedUnitTest    8 年前

    这行不是应该:

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

    是这样吗?

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