【问题标题】:Parsing uniquely named nested JSON解析唯一命名的嵌套 JSON
【发布时间】:2016-07-12 19:34:44
【问题描述】:

前言:我知道 JSON.NET 但我不能使用它(客户端机器)。

我需要将http://api.fixer.io/latest?base=USD 返回的 JSON 解析为 3 列,日期、货币代码和汇率。问题在于嵌套的“费率”部分。货币代码是第一个元素的名称,这意味着我不能使用“key”和“value”属性。我知道的唯一方法是对每个可能的货币代码进行硬编码,这就是我目前在下面的代码中所拥有的。我希望能够使用键/值对同时提取代码/速率。

JSON:

{"base":"USD",
 "date":"2016-07-12",
 "rates": {
     "AUD":1.3101,
     "BGN":1.7633,
     "BRL":3.2829,
     "CAD":1.3029,
     etc....}
 }

到目前为止我的代码:

static void Main(string[] args)
    {
        var curDate = "2001-01-01";
        var URL = @"http://api.fixer.io/" + curDate + "?base=USD";
        Console.WriteLine(URL);
        //WebRequest wrGetURL = WebRequest.Create(URL);
        var text = "";
        //wrGetURL.ContentType = "application/json; charset=utf-8";

        HttpWebRequest httpWebRequest = System.Net.WebRequest.Create(URL) as HttpWebRequest;

        using (HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse)
        {
            if (httpWebResponse.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception(string.Format("Server error (HTTP {0}: {1}).",
                    httpWebResponse.StatusCode, httpWebResponse.StatusDescription));
            }

            Stream stream = httpWebResponse.GetResponseStream();

            DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(JSONRead));
            JSONRead objResponse = (JSONRead)dataContractJsonSerializer.ReadObject(stream);

            Console.WriteLine(objResponse.rates.AUD);
        }
        Console.ReadLine();

    }

    [DataContract]
    public class JSONRead
    {
        [DataMember(Name = "date")]
        public string date { get; set; }

        [DataMember(Name = "rates")]
        public Rates rates { get; set; }

        [DataMember(Name = "base")]
        public string bases { get; set; }

    }

    [DataContract]
    public class Rates
    {
        [DataMember(Name = "AUD")]
        public string AUD { get; set; }

        //[DataMember(Name = "key")]
        //public string key { get; set; }

        //[DataMember(Name = "value")]
        //public string value { get; set; }
    }

我要返回的内容:

Date        Code  Rate
2016-07-12  AUD   1.3101
2016-07-12  GBN   1.7633
etc...

【问题讨论】:

  • 将费率定义为字典
  • @Plutonix 原谅我的无知,但在代码中会是什么样子?我看到了使用列表的其他示例,但没有从 API 调用返回任何内容。

标签: c# json parsing


【解决方案1】:

我必须使用DataContractJsonSerializerSettings 并将UseSimpleDictionaryFormat 设置为true。然后它将嵌套对象正确地读入 Dictionary 对象。感谢@Plutonix 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2023-04-02
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多