C# 仅返回一项时获取变量中的JSON数据
我试图从api中获取一些货币值。它将以以下格式返回数据:C# 仅返回一项时获取变量中的JSON数据,c#,json,C#,Json,我试图从api中获取一些货币值。它将以以下格式返回数据: {"PKR_PKR":{"val":1}} 我想在文本框中显示此值,但出现错误 “对象引用未设置为对象的实例” 我尝试了以下代码: try { string endPoint = @"http:urlhere"; string ResultJson = ""; using (WebClient wc = new WebClient()) { ResultJson = wc.Downloa
{"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) { }
**
- 更新
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; }
}
试试看
{
字符串端点=@“http://free.currencyconverterapi.com/api/v5/convert?q=“+ddlCurrency.SelectedValue.ToString()+”\u PKR&compact=y”;
字符串ResultJson=“”;
使用(WebClient wc=new WebClient())
{
ResultJson=wc.DownloadString(端点);
}
RootObject RootObject=JsonConvert.DeserializeObject(ResultJson);
txtBalanceRate.Text=rootObject.pkru PKR.val.ToString();
}
捕获(例外情况除外)
{
}
公共类PKRPKR
{
公共int val{get;set;}
}
公共类根对象
{
公共PKRPKR PKR_PKR{get;set;}
}
如果您打算使用动态对象,那么您应该尝试一下
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);
公共类PKRPKR
{
公共int val{get;set;}
}
公共类根对象
{
公共PKRPKR PKR_PKR{get;set;}
}
RootObject RootObject=JsonConvert.DeserializeObject(json);
Console.WriteLine(rootObject.pkru PKR.val);
大多数情况下,如果您看到上面的类结构,您会发现每个节点都表示为类,但我不会像VisualStudio为我做的那样详细介绍
谈到json到对象的转换,我使用VisualStudio提供的实用程序。它将json字符串转换为正确的类结构。这是它的图像
请在此处阅读如何完成完整操作:如果没有具有此功能的visual studio,则可以使用此联机实用程序:如果要使用动态对象,则应尝试此功能
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);
公共类PKRPKR
{
公共int val{get;set;}
}
公共类根对象
{
公共PKRPKR PKR_PKR{get;set;}
}
RootObject RootObject=JsonConvert.DeserializeObject(json);
Console.WriteLine(rootObject.pkru PKR.val);
大多数情况下,如果您看到上面的类结构,您会发现每个节点都表示为类,但我不会像VisualStudio为我做的那样详细介绍
谈到json到对象的转换,我使用VisualStudio提供的实用程序。它将json字符串转换为正确的类结构。这是它的图像
请在此处阅读如何完成完整操作:如果您的visual studio没有此功能,您可以使用此联机实用程序:我认为您的接收对象应该包含字典,而不是单个字符串:
或者您必须改进您的对象结构,实现包含PKR_PKR子对象的根项我认为您的接收对象应该包含字典,而不是单个字符串: 或者,您必须改进对象结构,实现包含PKR_PKR子对象的根项 注意:我无法更新PKR_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();
}
注意:我无法更新PKR_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();
}
JSON与
JsonData
类没有关系。创建一个匹配的类或使用JObject.Parse并访问单个属性如何执行此操作请帮助.PS删除Catch(Exception ex){}
块。它所做的唯一一件事是确保您的程序在尝试使用0的货币值销售时会因一个非常奇怪的错误而崩溃。JSON的可能副本与JsonData
类无关。创建一个匹配的类或使用JObject.Parse并访问单个属性如何执行此操作请帮助.PS删除Catch(Exception ex){}
块。它所做的唯一一件事是确保您的程序在尝试使用0的货币值销售时会因一个非常奇怪的错误而崩溃,这可能是为什么有两个类的重复?这是一个很好的答案,但我建议您添加一些解释,如“您需要一个根对象,其属性名称与JSON的根对象相同。”@AlinaAnjum JSON的每个节点都像一个类,您需要以与JSON相同的方式构建类结构is@Cid谢谢让我试试看我的更新为什么有两个类?这是一个很好的答案,但我建议你添加一些解释,比如“你需要一个根对象,它的属性与你的JSON的根对象名相同。”@AlinaAnjum JSON的每个节点都是l