当只返回一个项时,在变量中获取JSON数据

时间:2018-05-28 07:27:05

标签: c# json

我想从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; }
}

3 个答案:

答案 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字符串转换为适当的类结构。这是它的形象

enter image description here

在这里阅读如何完成:
Visual Studio Generate Class From JSON or XML

如果您没有使用此功能的visual studio,您可以使用此在线工具:json2csharp

答案 1 :(得分:0)

我认为你的接收对象应该包含一个字典,而不是一个字符串:

Check this

或者您必须改进实现包含PKR_PKR子对象的根项目的对象结构

答案 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();
}