C# 仅返回一项时获取变量中的JSON数据

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

我试图从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) { }
**

  • 更新
**

注意:我无法更新PKR\U 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; }
}
试试看
{
字符串端点=@“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