将JSON数据反序列化为c#中的类

时间:2018-06-03 15:32:10

标签: json xamarin.forms json.net

你好,我有这个Json数据: https://openexchangerates.org/api/latest.json?app_id=6cf59607a32d408eb3e04de1427a3169

我希望在以下类中反序列化

 using Newtonsoft.Json;
using System.Collections.Generic;

namespace Divisas2MVVM2.Classes

{
public class ExchangeRates
{
    [JsonProperty(PropertyName = "disclaimer")]
    public string Disclaimer { get; set; }

    [JsonProperty(PropertyName = "license")]
    public string License { get; set; }

    [JsonProperty(PropertyName = "timestamp")]
    public int TimeStamp { get; set; }

    [JsonProperty(PropertyName = "base")]
    public string Base { get; set; }

    [JsonProperty(PropertyName = "rates")]
    public Rates Rates { get; set; }
}

public class Rates
{
    public double AED { get; set; }
    public double AFN { get; set; }
    public double ALL { get; set; }
    public double AMD { get; set; }
    // I cut the text so that it would not be to long
    public double ZMW { get; set; }
    public double ZWL { get; set; }
}

public class Rate
{
    public double TaxRate { get; set; }

    public string Code { get; set; }
}

这是我的属性

 private ExchangeRates exchangeRates;

我的MainViewModel的构造函数

new ObservableCollection data
Rates = new ObservableCollection<Rate>();

并在此方法中获取json数据

 try
        {
            var client = new HttpClient();
            client.BaseAddress = new Uri("https://openexchangerates.org");
            var url = "/api/latest.json?app_id=6cf59607a32d408eb3e04de1427a3169";
            var response = await client.GetAsync(url);

            if (!response.IsSuccessStatusCode)
            {
                Message = response.StatusCode.ToString();
                IsRunning = false;
                return;
            }

            var result = await response.Content.ReadAsStringAsync();
            exchangeRates = JsonConvert.DeserializeObject<ExchangeRates>(result);

        }

一切正常,变量结果正确地以字符串格式表示json数据,但是当我调用JsonConvert时。 DeserializeObject,数据&#34;率&#34;没有正确分配,所有其他数据:免责声明&#34;,&#34;许可证&#34;,&#34;时间戳&#34;等正确分配。只有费率失败。

the string is correct

other data is correct in the class

rates is incorrect

对不起我的英语我希望你能理解我:)

1 个答案:

答案 0 :(得分:1)

将其用作模型类

namespace Rate
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Rates
    {
        [JsonProperty("disclaimer")]
        public string Disclaimer { get; set; }

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

        [JsonProperty("timestamp")]
        public long Timestamp { get; set; }

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

        [JsonProperty("rates")]
        public Dictionary<string, double> RatesRates { get; set; }
    }

    public partial class Rates
    {
        public static Rates FromJson(string json) => JsonConvert.DeserializeObject<Rates>(json, Rate.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this Rates self) => JsonConvert.SerializeObject(self, Rate.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters = {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}

然后在你的课堂上做这个

            var data = Rate.Rates.FromJson("jsonresult");


            var  rate = data.RatesRates;
            foreach (var pair in rate)
            {
                string symbol = pair.Key;  //"AED"
                double value = pair.Value; //3.673175,
            }


var time = data.Timestamp;
            var disclaimer = data.Disclaimer;
            var license = data.License;

经过测试和工作