JSON到C#数组

问题描述 投票:0回答:3

我有一个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 []'的类型定义无参数构造函数。

c# json javascriptserializer
3个回答
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


0
投票

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

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

namespace ClientConsultationSystem
{
    public class Rates
    {
        public Rates() { }  // optional constructor
        public Double SGD { get; set; }
    }

    public class Item
    {
        public Item()
        {
            r = new Rates();
        }
        public String b { get; set; }
        public string d { get; set; }
        public Rates r { get; set; }
    }
}

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的知识,我将不胜感激。

再一次,非常感谢你的心底。

© www.soinside.com 2019 - 2024. All rights reserved.