【问题标题】:JSON serialization C# CoreJSON 序列化 C# 核心
【发布时间】:2019-08-28 03:08:52
【问题描述】:

我是 JSON 序列化的新手。 案子 我正在调用一个休息 API,然后获取信息。我希望能够从 API 中提取信息并将其用于计算。我无法序列化我的数据任何帮助/指导都会有所帮助 我的代码

    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)

;

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

样本数据

\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}"

【问题讨论】:

  • 请提供您未转义的 JSON。
  • @John 我正在从以下 url alphavantage.co/… 读取数据,然后 GlobalQuoteUriContent = await response.Content.ReadAsStringAsync();
  • 在问题中提供您的未转义 JSON。

标签: c# json .net-core


【解决方案1】:

如果您查看响应,它会在每个属性中包含空格和数字。

{ “全球报价”:{ "01. 符号": "MSFT", "02. 打开": "134.9900", "03. 高": "136.7200", "04. 低": "134.6681", "05. 价格": "135.7400", "06. 卷": "16639726", "07.最近交易日": "2019-08-27", "08. 前收盘价": "135.4500", "09. 变化": "0.2900", “10. 变化百分比”:“0.2141%” } }

所以创建一个类如下:

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

【讨论】:

  • 感谢您的帮助,这正是我需要构建的,您可以参考的任何进一步阅读材料都会有所帮助。
【解决方案2】:

我使用这些扩展程序

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

【讨论】:

    【解决方案3】:

    如果您从这个 JSON 生成您的类,则无需使用反序列化器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 2016-06-19
      • 2017-01-30
      相关资源
      最近更新 更多