JSON到C#数组

时间:2018-03-06 04:36:32

标签: c# json javascriptserializer

我有一种需要提高某种货币汇率的ASP.NET方法。

protected void btnTest_Click(object sender, EventArgs e)
{
    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format("https://api.fixer.io/latest?base=JPY&symbols=SGD"));

    WebReq.Method = "GET";

    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

    string jsonString;
    using (Stream stream = WebResp.GetResponseStream())   
    {
        StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
        jsonString = reader.ReadToEnd();
    }

    JavaScriptSerializer js = new JavaScriptSerializer();
    Item[] rates = js.Deserialize<Item[]>(jsonString);

    for (int i = 0; i < rates.Length; i++)
    {
        Item rate = new Item();
        rate = (Item) (rates[i]);
        Rates rb=(Rates) rate.r;

        lblResult.Text = lblResult.Text + rb.SGD;
    }
}

这是Item.cs类

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

namespace ClientConsultationSystem
{
    public class Rates
    {
        public double SGD { get; set; }
    }

    public class Item
    {
        public string b { get; set; }
        public string d { get; set; }
        public Rates r { get; set; }
    }


}

不确定我做错了什么,但我收到了这个错误。

  

没有为'ClientConsultationSystem.Item []'的类型定义无参数构造函数。

3 个答案:

答案 0 :(得分:0)

埃文说。换句话说..您的代码需要构造函数,如:

.parent {
  width: 1200px;
  background-color: #333;

  margin: 20px 0; /* outer margin doesn't matter */
}

.parent .child {
  width: 400px;
  height: 300px;
  display: inline-block;
  background-color: #ccc;
}

答案 1 :(得分:0)

您需要转换为List而不是Item [],因为JavascriptSerializer会反序列化为IEnumerable。

我对您的代码进行了一些更改:

    JavaScriptSerializer js = new JavaScriptSerializer();
    var rates = js.Deserialize<List<Item>>(jsonString);

    for (int i = 0; i < rates.Count; i++)
    {
        Item rate = new Item();
        rate = (Item)(rates[i]);
        Rates rb = (Rates)rate.rates;
    }
    public class Item
    {

        public string @base { get; set; }
        public string date { get; set; }
        public Rates rates { get; set; }
    }

虽然反序列化使对象与源紧密匹配很重要。由于@base是保留字,因此需要base

答案 2 :(得分:0)

非常感谢您的回复。我设法让它运作起来。 自从我开始为我的公司编写整个Intranet系统以来,已经有一段时间了,所以我只依赖于我从Java获得的任何知识以及我为最后一年的项目编程所做的工作。

protected void Page_Load(object sender, EventArgs e)
{
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format("https://api.fixer.io/latest?base=JPY&symbols=SGD"));
        WebReq.Method = "GET";

        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

        string json;
        using (Stream stream = WebResp.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
            json = reader.ReadToEnd();
        }

        var rates = JsonConvert.DeserializeObject<Item>(json);

        Item r = new Item();
        r = (Item)(rates);
        Rates rb = (Rates)r.rates;
        lblResult.Text = lblResult.Text + "" + rb.SGD;

    }

Item类

public class Rates
{
        public double SGD { get; set; }
}

public class Item
{
    public Item()
    {
        rates = new Rates();
    }
    public string @base { get; set; }
    public string date { get; set; }
    public Rates rates { get; set; }
}

如果有任何资源/书籍可以帮助我在C#上建立我对JSON的知识,我会很感激分享。

再一次,衷心感谢你。