[英]How to get values from json string using newtonsoft .json in c#
[英]Get second level values from JSON string using C# and using a foreach
完成JSON的新手 - 這是我第一次使用C#進入JSON。
我有一個HTTP get請求返回的記錄。
var exchRateData = Get($"https://api.exchangeratesapi.io/2018-10-30?base=EUR&symbols=AUD");
退貨: {"date":"2018-10-30","rates":{"AUD":1.6025},"base":"EUR"}
。
AUD和1.6025值都是GET請求中的變量。 所以GET請求可以是SGD或INR,它返回:
{"date":"2018-10-30","rates":{"SGD":0.0187977737},"base":"INR"}
總是返回一個帶有級別的記錄,就像上面的兩個例子一樣。
我想要的是訪問二級值的值,
即{"AUD":1.6025} or {"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;
}
}
請幫忙....
我建議使用JSON.NET
在這里,您將JSON字符串反序列化為c#模型類
您的模型類看起來像使用json2csharp生成的模型
public class Rates
{
[JsonProperty(PropertyName = "fieldName")]
public double currency { get; set; }
}
public class RootObject
{
public string date { get; set; }
public Rates rates { get; set; }
public string @base { get; set; }
}
然后,這是使用JSON.NET反序列化它的方法
// THis works for normal secanario but it won't work for you
var exchangeRates = JsonConvert.DeserializeObject<RootObject>("Your Json String goes here");
但是,您的JSON場景有點復雜,因此您必須使用CustomContractResolver
這是一個例子
ContractResolver類
internal class CustomContractResolver : DefaultContractResolver
{
public CustomContractResolver(string fieldName)
{
FieldName = fieldName;
}
public string FieldName { get; set; }
protected override string ResolvePropertyName(string propertyName)
{
return propertyName == "fieldName" ? FieldName : base.ResolvePropertyName(propertyName);
}
}
如何使用此設置
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;
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);
如果只有一個速率(這是OP想要的速率),接受的解決方案可以正常工作,但它不會超過1個速率。 此外,它增加了額外的復雜性,可以通過使用Dictionary
來避免(見下文)。
示例 - 以下請求( AUD
, USD
, GBP
)
https://api.exchangeratesapi.io/2018-10-30?base=EUR&symbols=AUD,USD,GBP
將返回以下json:
{ “日期”: “2018年10月30日”, “速度”:{ “USD”:1.1372, “英鎊”:0.89148, “AUD”:1.6025}, “基地”: “EUR”}
您可以使用以下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; }
}
反序列化json字符串:
string json = @"{""date"":""2018-10-30"",""rates"":{""USD"":1.1372,""GBP"":0.89148,""AUD"":1.6025},""base"":""EUR""}";
ExchangeRate rate = JsonConvert.DeserializeObject<ExchangeRate>(json);
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.