简体   繁体   中英

JSON to C# array

I have a ASP.NET method that needs to pull up some currency rates.

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

This is the Item.cs class

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


}

Not sure what i am doing wrong, but i got this error.

No parameterless constructor defined for type of 'ClientConsultationSystem.Item[]'.

What Evan said. In other words.. your code needs constructors like:

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

You need to convert into a List instead of an Item[] because JavascriptSerializer deserializes into an IEnumerable.

I made some changes to your code:

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

While deserializing it is important to have the object closely match the source. The @base is needed since base is a reserved word.

Thank you so much for the responses. I managed to get it working. It's been a while since i starting programming the whole Intranet system for my company, so i am just relying on whatever knowledge i have from Java and what i did for my final year project to do programming.

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;

    }

The Item class

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

If there is any resources/books that can help me to build up my knowledge on JSON on C#, i would appreciate some sharing.

Once again, thank you very much from the bottom of my heart.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM