Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#和foreach从JSON字符串获取二级值_C#_Arrays_Json.net - Fatal编程技术网

使用C#和foreach从JSON字符串获取二级值

使用C#和foreach从JSON字符串获取二级值,c#,arrays,json.net,C#,Arrays,Json.net,JSON的完全新手-这是我第一次使用C#进入JSON 我有一条从HTTP get请求返回的记录 var exchratata=Get($)https://api.exchangeratesapi.io/2018-10-30?base=EUR&symbols=AUD"); 返回: {“日期”:“2018-10-30”,“费率”:{“澳元”:1.6025},“基数”:“欧元”} AUD和1.6025值都是GET请求中的变量。因此GET请求可以是SGD或INR,返回: {“日期”:“2018-10-3

JSON的完全新手-这是我第一次使用C#进入JSON

我有一条从HTTP get请求返回的记录

var exchratata=Get($)https://api.exchangeratesapi.io/2018-10-30?base=EUR&symbols=AUD");

返回:
{“日期”:“2018-10-30”,“费率”:{“澳元”:1.6025},“基数”:“欧元”}

AUD和1.6025值都是GET请求中的变量。因此GET请求可以是SGD或INR,返回:

{“日期”:“2018-10-30”,“费率”:{“SGD”:0.0187977737},“基数”:“INR”}

始终返回一条具有级别的记录,就像上面的两个示例一样

我想要的是访问第二级值的值

i、 e
{“AUD”:1.6025}或{“SGD”:0.0187977737}

我试过:

var jsonResult = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(exchRateData);
                    foreach (var keyValue in jsonResult)
                {
                    try
                    {
                        LblGetValues.Text = LblGetValues.Text + "Key: " + keyValue.Key + " Value:" + keyValue.Value + "<br>";
                        if (keyValue.Key == "date")
                            LblDate.Text = keyValue.Value;

//This is where I get stuck.
                        if (keyValue.Key == "rates")
                        {
// I would like to be able to do this here : 
//string currencyCode =  "AUD" (or "SGD" if second GET request)
//double currencyRate = 1.6025  (or 0.0187977737 if second GET request)
                            //JArray secondLevel = new JArray("rates");

                         //   LblRate.Text = keyValue.Value.ToString();

                        }

                        if (keyValue.Key == "base")
                            LblBase.Text = keyValue.Value;
                    }
                    catch (Exception errMsg)
                    {
                        LblMsg.Text = errMsg.Message + errMsg.StackTrace;
                    }
                }
var jsonResult=JsonConvert.DeserializeObject(exchRateData);
foreach(jsonResult中的var keyValue)
{
尝试
{
LblGetValues.Text=LblGetValues.Text+“键:”+keyValue.Key+“值:”+keyValue.Value+“
”; 如果(keyValue.Key==“日期”) LblDate.Text=keyValue.Value; //这就是我被卡住的地方。 如果(keyValue.Key==“费率”) { //我希望能够在这里做到这一点: //字符串currencyCode=“AUD”(如果第二次GET请求,则为“SGD”) //双电流率=1.6025(如果第二次GET请求,则为0.0187977737) //JArray secondLevel=新JArray(“费率”); //LblRate.Text=keyValue.Value.ToString(); } 如果(keyValue.Key==“基本”) LblBase.Text=keyValue.Value; } 捕获(异常errMsg) { LblMsg.Text=errMsg.Message+errMsg.StackTrace; } }
请帮助……

公共课收费
   public class Rates
    {
        public double AUD { get; set; }
    }

    public class ObjectCurrency
    {
        public string date { get; set; }
        public Rates rates { get; set; }
        public string @base { get; set; }
    }


  var data= JsonConvert.DeserializeObject<ObjectCurrency>(exchRateData);
{ 公共双AUD{get;set;} } 公共类对象货币 { 公共字符串日期{get;set;} 公共费率{get;set;} 公共字符串@base{get;set;} } var data=JsonConvert.DeserializeObject(exchRateData);
我建议使用

在这里,您将把JSON字符串反序列化到c#模型类中

你的模型课看起来像这样

这就是使用JSON.NET对其进行反序列化的方式

// THis works for normal secanario but it won't work for you 
var exchangeRates = JsonConvert.DeserializeObject<RootObject>("Your Json String goes here");
如何使用此设置

var settings = new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.Ignore,
    MissingMemberHandling = MissingMemberHandling.Ignore,
    ContractResolver = new CustomContractResolver("Pass Your currency here")
};

// Make Http Calls here and replace returned string in below method

var data = JsonConvert.DeserializeObject<RootObject>("Your JSON String", setting);
// Here You can access your currency rates
double currencyRate = data.currency;
var设置=新的JsonSerializerSettings
{
DefaultValueHandling=DefaultValueHandling.Ignore,
MissingMemberHandling=MissingMemberHandling.Ignore,
ContractResolver=new CustomContractResolver(“在此处传递您的货币”)
};
//在此处进行Http调用,并替换下面方法中返回的字符串
var data=JsonConvert.DeserializeObject(“您的JSON字符串”,设置);
//在这里您可以访问您的货币汇率
双币种汇率=data.currency;

如果只有一个速率(这是OP想要的),则可接受的解决方案可以正常工作,但不能使用超过1个速率。此外,它还增加了额外的复杂性,这可以通过使用
字典来避免(见下文)

示例-以下请求(
AUD
USD
GBP

将返回以下json:

{“日期”:“2018-10-30”,“汇率”:{“美元”:1.1372,“英镑”:0.89148,“澳元”:1.6025},“基数”:“欧元”}

您可以使用以下C#类来反序列化json字符串:

public class ExchangeRate
{
    [JsonProperty("date")]
    public string Date { get; set; }

    [JsonProperty("rates")]
    public Dictionary<string, decimal> Rate { get; set; }

    [JsonProperty("base")]
    public string Base { get; set; }
}
string json = @"{""date"":""2018-10-30"",""rates"":{""USD"":1.1372,""GBP"":0.89148,""AUD"":1.6025},""base"":""EUR""}";

ExchangeRate rate = JsonConvert.DeserializeObject<ExchangeRate>(json);
公共类交换率
{
[JsonProperty(“日期”)]
公共字符串日期{get;set;}
[JsonProperty(“费率”)]
公共字典速率{get;set;}
[JsonProperty(“基础”)]
公共字符串基{get;set;}
}
反序列化json字符串:

public class ExchangeRate
{
    [JsonProperty("date")]
    public string Date { get; set; }

    [JsonProperty("rates")]
    public Dictionary<string, decimal> Rate { get; set; }

    [JsonProperty("base")]
    public string Base { get; set; }
}
string json = @"{""date"":""2018-10-30"",""rates"":{""USD"":1.1372,""GBP"":0.89148,""AUD"":1.6025},""base"":""EUR""}";

ExchangeRate rate = JsonConvert.DeserializeObject<ExchangeRate>(json);
string json=@“{”日期“:”2018-10-30“,”汇率“:{”美元“:1.1372”,“英镑“:0.89148”,“澳元“:1.6025}”,“基数“:”欧元“}”;
ExchangeRate=JsonConvert.DeserializeObject(json);
结果:


这可能会有所帮助-它有一个很好的扩展方法:有点被动攻击。ePossum,作为记录,一个容易阅读的问题更容易回答,这里有一个链接指向你将来可能遇到的格式化问题的降价:我看不到你所指的“被动攻击性”。今天早上我感觉很好,我不会让这个来自@user3577502的小流氓破坏我的一天。感谢Mihir Dave提供的解决方案。就像魅力一样,你让我开心了……@eposum如果你只要求1种货币,而不是多个货币(例如),那么接受的解决方案将有效。检查我的回答是@Rui Jarimba。你是对的。然而,我确实接受了这个解决方案,因为我们只需要为这个项目提供一个费率。我们需要两种货币代码之间的转换。API也有多个日期、日期范围等选项,我们不希望通过查看返回单一汇率以外的解决方案而出现任何范围蠕变,但是,您的答案很有用,因为我们将在完成转换项目后开始货币三角测量。这两个项目是完全独立的,因此不需要对这两个项目采用相同的解决方案。当然,我已经记下了你的答案。太好了!“诀窍”是使用正确的“类型”调用
JsonConvert.DeserializeObject()
,如您所示。我不确定这段代码是否一定适用于OP,因为他可能需要更改一些东西。但这绝对是正确的方法。我在上面的笔记中指出:当请求从澳元更改为印度卢比时会发生什么?这段代码将中断。我在上面的注释中指出:AUD和SGD是Get请求中的变量。它可能是MXP,甚至是其他变量。实际上,我有一个键,它是JSON语句中的一个变量。澳元可以是任何3位货币代码。这个班的成绩是c