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.