我想从api获取一些货币值。它以下列格式返回数据:
{"PKR_PKR":{"val":1}}
我想在文本框中显示此值但是出现错误
"对象引用未设置为对象的实例"。
我尝试过以下代码:
try
{
string endPoint = @"http:urlhere";
string ResultJson = "";
using (WebClient wc = new WebClient())
{
ResultJson = wc.DownloadString(endPoint);
}
JsonData values = JsonConvert.DeserializeObject<JsonData>(ResultJson);
txtBalanceRate.Text = values.CurrencyValue.ToString();
}
catch (Exception ex) { }
班级代码:
class JsonData
{
public object CurrencyValue { get; set; }
}
**
**
注意:每次不同货币的变量名称不同时,我都无法更新PKR_PKR类,即可以是USD_PKR,EUR_PKR等 我该如何解决这个问题?
以下是更新的代码:
try
{
string endPoint = @"http://free.currencyconverterapi.com/api/v5/convert?q="+ddlCurrency.SelectedValue.ToString()+"_PKR&compact=y";
string ResultJson = "";
using (WebClient wc = new WebClient())
{
ResultJson = wc.DownloadString(endPoint);
}
RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(ResultJson);
txtBalanceRate.Text = rootObject.PKR_PKR.val.ToString();
}
catch (Exception ex)
{
}
public class PKRPKR
{
public int val { get; set; }
}
public class RootObject
{
public PKRPKR PKR_PKR { get; set; }
}
答案 0 :(得分:3)
如果您要使用动态对象,那么您应该尝试一下
dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
Type typeOfDynamic = data.GetType();
if( typeOfDynamic.GetProperties().Where(p => p.Name.Equals("PKR_PKR")).Any())
{
console.WriteLine(data.PKR_PKR.val);
}
else if( typeOfDynamic.GetProperties().Where(p => p.Name.Equals("USD_PKR")).Any())
{
console.WriteLine(data.USD_PKR.val);
}
else if( typeOfDynamic.GetProperties().Where(p => p.Name.Equals("EUR_PKR")).Any())
{
console.WriteLine(data.EUR_PKR.val);
}
上面的方法没有尝试和测试,但你可以试试这样,因为你的json是动态的。
以上方法是检查属性是否存在,并从dynamci对象获取val
您的课程结构不正确请您尝试下面的课程结构
public class PKRPKR
{
public int val { get; set; }
}
public class RootObject
{
public PKRPKR PKR_PKR { get; set; }
}
RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(json);
Console.WriteLine(rootObject.PKR_PKR.val);
大多数情况下,如果您看到上面的类结构,那么您认为每个节点都表示为类,但我不太详细,因为Visual Studio可以为我做。
当谈到json到对象转换时,我使用Visual Studio提供的实用程序。它将json字符串转换为适当的类结构。这是它的形象
在这里阅读如何完成:
Visual Studio Generate Class From JSON or XML
如果您没有使用此功能的visual studio,您可以使用此在线工具:json2csharp
答案 1 :(得分:0)
答案 2 :(得分:0)
注意:我无法更新PKR_PKR类因为名称的外翻时间 变量对于不同的货币是不同的,即它可以是USD_PKR ,EUR_PKR等我该如何解决这个问题?
<强>解强>
如果您的案例中修复了json字符串{"PKR_PKR":{"val":1}}
,您可以使用以下解决方案获取您获得的任何货币名称。
static void Main(string[] args)
{
string json1 = "{ \"PKR_PKR\":{ \"val\":1}}";
string json2 = "{ \"USD_PKR\":{ \"val\":2}}";
string json3 = "{ \"EUR_PKR\":{ \"val\":3}}";
JToken token1 = (JToken)JsonConvert.DeserializeObject(json1);
Console.WriteLine(token1.First().First()["val"]);
JToken token2 = (JToken)JsonConvert.DeserializeObject(json2);
Console.WriteLine(token2.First().First()["val"]);
JToken token3 = (JToken)JsonConvert.DeserializeObject(json3);
Console.WriteLine(token3.First().First()["val"]);
Console.ReadLine();
}