0

I am new to JSON serialization. Case I am making a call to a rest API and then getting info. I want to be able to extract information from the API and use it to for calculation. I am not able to serialise my data any help/guidance will be helpful my code

    public string GlobalQuoteUri = "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=MSFT&apikey=demo";

            private readonly HttpClient _httpClient;

            public GlobalQuoteProvider()
            {
                _httpClient = new HttpClient();
            }
var response = await _httpClient.GetAsync(GlobalQuoteUri, cancellationToken);


                if (response.IsSuccessStatusCode)
                {
                    GlobalQuoteUriContent = await response.Content.ReadAsStringAsync();
                }
                var result = JsonConvert.DeserializeObject<RootGlobalQuote>(GlobalQuoteUriContent)

;

Classes

public class RootGlobalQuote
    {
        public string Metadata { get; set; }
        public List<AlphavantageGlobalQoute> GlobalQoute { get; set; }
    }
public class AlphavantageGlobalQoute
    {
        public Guid AlphavantageGlobalQouteId { get; set; }
        [DataMember]
        public string Symbol { get; set; }
        [DataMember]
        public string Open { get; set; }
        [DataMember]
        public string High { get; set; }
        [DataMember]
        public string Low { get; set; }
        [DataMember]
        public string Price { get; set; }
        [DataMember]
        public string Volume { get; set; }
        [DataMember]
        public string LatestTradingDay { get; set; }
        [DataMember]
        public string PreviousClose { get; set; }
        [DataMember]
        public string Change { get; set; }
        [DataMember]
        public string Changepercent { get; set; }
    }

Sample data

\n    \"Global Quote\": {\n        \"01. symbol\": \"MSFT\",\n        \"02. open\": \"134.9900\",\n        \"03. high\": \"136.7200\",\n        \"04. low\": \"134.6681\",\n        \"05. price\": \"135.7400\",\n        \"06. volume\": \"16639726\",\n        \"07. latest trading day\": \"2019-08-27\",\n        \"08. previous close\": \"135.4500\",\n        \"09. change\": \"0.2900\",\n        \"10. change percent\": \"0.2141%\"\n    }\n}"
3
  • 1
    Please provide your unescaped JSON. Commented Aug 28, 2019 at 3:10
  • @John I am reading the data from the following url alphavantage.co/… and then GlobalQuoteUriContent = await response.Content.ReadAsStringAsync(); Commented Aug 28, 2019 at 3:13
  • Please provide your unescaped JSON in the question. Commented Aug 28, 2019 at 3:15

3 Answers 3

2

If you look into the response, it has spaces and has numbers in each property.

{ "Global Quote": { "01. symbol": "MSFT", "02. open": "134.9900", "03. high": "136.7200", "04. low": "134.6681", "05. price": "135.7400", "06. volume": "16639726", "07. latest trading day": "2019-08-27", "08. previous close": "135.4500", "09. change": "0.2900", "10. change percent": "0.2141%" } }

So create a class as follows:

public class RootGlobalQuote
{
    [JsonProperty("Global Quote")]
    public GlobalQuote GlobalQuote { get; set; }
}

public class GlobalQuote
{
    [JsonProperty("01. symbol")]
    public string Symbol { get; set; }

    [JsonProperty("02. open")]
    public string Open { get; set; }

    [JsonProperty("03. high")]
    public string High { get; set; }

    [JsonProperty("04. low")]
    public string Low { get; set; }

    [JsonProperty("05. price")]
    public string Price { get; set; }

    [JsonProperty("06. volume")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long Volume { get; set; }

    [JsonProperty("07. latest trading day")]
    public DateTimeOffset LatestTradingDay { get; set; }

    [JsonProperty("08. previous close")]
    public string PreviousClose { get; set; }

    [JsonProperty("09. change")]
    public string Change { get; set; }

    [JsonProperty("10. change percent")]
    public string ChangePercent { get; set; }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the help it's just what I needed to build, any further reading material you can refer will be helpful.
1

I use these extensions

using Newtonsoft.Json;
using System.IO;    
public static class MyExtensions
{
    /// <summary>
    /// Serialize on object to bute[]
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    public static byte[] SerializeBinary(this object model)
    {
        MemoryStream stream = new MemoryStream();
        try
        {
            using (StreamWriter writer = new StreamWriter(stream))
            using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
            {
                Newtonsoft.Json.JsonSerializer ser = new Newtonsoft.Json.JsonSerializer();
                ser.Serialize(jsonWriter, model);
                jsonWriter.Flush();
            }
        }
        finally
        {
            stream.Close();
        }
        return stream.ToArray();
    }
    /// <summary>
    /// Deserialize byte[] to an object of type T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="serializedObj"></param>
    /// <returns></returns>
    public static T DeserializeBinary<T>(this byte[] serializedObj)
    {
        MemoryStream stream = new MemoryStream(serializedObj);
        using (StreamReader reader = new StreamReader(stream))
        using (JsonTextReader jsonReader = new JsonTextReader(reader))
        {
            Newtonsoft.Json.JsonSerializer ser = new Newtonsoft.Json.JsonSerializer();
            return ser.Deserialize<T>(jsonReader);
        }
    }

    /// <summary>
    /// Serialize an object to JSON
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    public static string SerializeJson(this object model)
    {
        var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
        var json= JsonConvert.SerializeObject(model, settings);
        return json;
    }

    /// <summary>
    /// Deserialize a string to object of T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="json"></param>
    /// <returns></returns>
    public static T DeserializeJson<T>(this string json)
    {
        var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
        T model = JsonConvert.DeserializeObject<T>(json, settings);
        return model;
    }
    /// <summary>
    /// Deserialize a string to object
    /// </summary>
    /// <param name="json"></param>
    /// <returns></returns>
    public static object DeserializeJson(this string json)
    {
        var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
        object model = JsonConvert.DeserializeObject(json, settings);
        return model;
    }
}

Comments

0

If you generated your class from this JSON, no need to use deserializer.

RootGlobalQuote rg = null;
RootGlobalQuote rgOut = null;

var response = _httpClient.GetAsync(GlobalQuoteUri);
response.Wait();

var resp = response.Result;

if (resp.IsSuccessStatusCode)
{
    var outRg = resp.Content.ReadAsAsync<RootGlobalQuote>();
    outRg.Wait();
    rg = outRg.Result;
    result = new RootGlobalQuote();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.