Search code examples
jsonuwpodata

Get item from JSON Odata list for UWP


I have been having a hard time trying to figure this out that I've just about torn out all my hair now.

Using this section of code (Added a var result that I looking at with a stoppoint):

public async Task<string> GetHttpSPContentWithToken(string url, string token)
    {
        var httpClient = new System.Net.Http.HttpClient();
        System.Net.Http.HttpResponseMessage response;
        try
        {
            var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
            //Add the token in Authorization header
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
           response = await httpClient.SendAsync(request);
            var content = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<SharePointListItems.Fields>(content);
            return content;
        }
        catch (Exception ex)
        {
            return ex.ToString();
        }
    }

The content that I receive is this (updated getting rid of extra information):

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('root')/lists('FBA0AB63-8453-4BB9-AA17-142A5D72A50D')/items/$entity",
  "@odata.etag": "\"60d40002-0f08-4f29-afa7-0287137b863b,1\"",
  "createdDateTime": "2018-08-07T14:28:47Z",
  "eTag": "\"60d40002-0f08-4f29-afa7-0287137b863b,1\"",
  "id": "1",
  "lastModifiedDateTime": "2018-08-07T14:28:47Z",
  "webUrl": "https://XXXX.sharepoint.com/Lists/TestList/1_.000",
  "createdBy": {
    "user": {
      "email": "[email protected]",
      "id": "b5f81cc6-f8b7-46b7-8e10-6ce1b9689c23",
      "displayName": "TK"
    }
  },
  "lastModifiedBy": {
    "user": {
      "email": "[email protected]",
      "id": "b5f81cc6-f8b7-46b7-8e10-6ce1b9689c23",
      "displayName": "TK"
    }
  },
  "parentReference": {},
  "contentType": {
    "id": "0x010001403BD420356E4ABE3B63E5AEC0713D"
  },
  "[email protected]": "https://graph.microsoft.com/v1.0/$metadata#sites('root')/lists('FBA0AB63-8453-4BB9-AA17-142A5D72A50D')/items('1')/fields/$entity",
  "fields": {
    "@odata.etag": "\"60d40002-0f08-4f29-afa7-0287137b863b,1\"",
    "Title": "1",
    "UserName": "TK",
    "UserAge": "47",
    "UserTitle": "Developer"
  }
}

I just want the values forUserAge, UserName, and UserTitle to put each into a textbox, but not sure how to pull them out.

I am pretty sure that I need to set up a class of some sort, but it is the @odata parts that are breaking my back.

Everything that I have tried just gives me back a null value. I see the value there, just not sure how to parse/pull it out.

I have looked at this (updated):

using Newtonsoft.Json;
using System;

public class SharePointListItems
{
    public class UserCreated
    {
        public string email { get; set; }
        public string id { get; set; }
        public string displayName { get; set; }
    }

    public class CreatedBy
    {
        public UserCreated user { get; set; }
    }

    public class UserModified
    {
        public string email { get; set; }
        public string id { get; set; }
        public string displayName { get; set; }
    }

    public class LastModifiedBy
    {
        public UserModified user { get; set; }
    }

    public class ParentReference
    {
    }

    public class ContentType
    {
        public string id { get; set; }
    }

    public class Fields
    {
        [JsonProperty("@odata.etag")]
        public string ODataETag { get; set; }

        public string Title { get; set; }
        public string UserName { get; set; }
        public string UserAge { get; set; }
        public string UserTitle { get; set; }
    }

    public class RootObject
    {
        [JsonProperty("@odata.context")]
        public string ODataContext { get; set; }

        [JsonProperty("@odata.etag")]
        public string ODataETag { get; set; }

        public DateTime createdDateTime { get; set; }
        public string eTag { get; set; }
        public string id { get; set; }
        public DateTime lastModifiedDateTime { get; set; }
        public string webUrl { get; set; }
        public CreatedBy createdBy { get; set; }
        public LastModifiedBy lastModifiedBy { get; set; }
        public ParentReference parentReference { get; set; }
        public ContentType contentType { get; set; }

        [JsonProperty("[email protected]")]
        public string FieldsODataContext { get; set; }

        public Fields fields { get; set; }
    }
}

But then I run into the issue that there is two [JsonProperty("@odata.etag")].


Solution

  • The [JsonProperty] custom attribute is added to the C# property that actually holds that value. Instead of putting the attribute on the Title or createDateTime property, you need to put them on their own properties:

    public class RootObject
    {
        [JsonProperty("@odata.context")]
        public string ODataContext { get; set; }
    
        [JsonProperty("@odata.etag")]
        public string ODataETag { get; set; }
    
        // No attribute needed here
        public DateTime createdDateTime { get; set; }
    
        // etc...
    

    Also, you are trying to parse the content as a Fields class, but it is a RootObject; you need to use

    JsonConvert.DeserializeObject<SharePointListItems.RootObject>(content)
    

    To get the object.