C# 在C中访问JSON的子值#
当我运行这个简单的JSON API调用代码时,我收到一个错误 无法访问Newtonsoft.Json.Linq.JProperty上的子值C# 在C中访问JSON的子值#,c#,json,linq,C#,Json,Linq,当我运行这个简单的JSON API调用代码时,我收到一个错误 无法访问Newtonsoft.Json.Linq.JProperty上的子值 USDTWD(在[quotes]中唯一一个部分应该调用double,它返回美元对TWD的汇率,甚至尝试将其作为字符串调用似乎也没有帮助。我有一个建议,可以通过使用具有结构而不是“raw”的类来解决这个问题JObject。如果创建这样的类: public static void apiCall2() { WebClient c = new WebCli
USDTWD(在[quotes]中唯一一个部分应该调用double,它返回美元对TWD的汇率,甚至尝试将其作为字符串调用似乎也没有帮助。我有一个建议,可以通过使用具有结构而不是“raw”的类来解决这个问题JObject。如果创建这样的类:
public static void apiCall2()
{
WebClient c = new WebClient();
var data = c.DownloadString(baseURL + endPoint + "?access_key=" + accessKey + "¤cies=TWD&source=USD&format=1");
//Console.WriteLine(data);
JObject api = JObject.Parse(data);
string conversion = "";
foreach (var result in api["quotes"])
{
System.Console.WriteLine(result);
conversion = (string)result["USDTWD"];
System.Console.WriteLine(conversion);
}
}
public class ResponseModel
{
public bool Success {get;set;}
....
public List<Quote> Quotes {get;set;}
}
public class QuoteModel
{
public decimal USDTWD {get;set;}
}
公共类响应模型
{
公共bool成功{get;set;}
....
公共列表引号{get;set;}
}
公共类QuoteModel
{
公共十进制USDTWD{get;set;}
}
然后您可以像这样转换为该对象:
public static void apiCall2()
{
WebClient c = new WebClient();
var data = c.DownloadString(baseURL + endPoint + "?access_key=" + accessKey + "¤cies=TWD&source=USD&format=1");
//Console.WriteLine(data);
JObject api = JObject.Parse(data);
string conversion = "";
foreach (var result in api["quotes"])
{
System.Console.WriteLine(result);
conversion = (string)result["USDTWD"];
System.Console.WriteLine(conversion);
}
}
public class ResponseModel
{
public bool Success {get;set;}
....
public List<Quote> Quotes {get;set;}
}
public class QuoteModel
{
public decimal USDTWD {get;set;}
}
var response=api.ToObject();
我不确定这是否为您所接受(例如,您可能没有所有不同的报价,或者没有列出所有报价)。但在我看来,这通常是一种比直接使用JObject更方便的处理回复的方法
另外,您甚至可以使用List as Quotes属性来不进行硬编码,但我不确定它是如何得到支持的。我有一个建议,可以帮助您通过使用具有结构的类而不是“原始”JObject来解决此问题。如果您创建这样的类:
public static void apiCall2()
{
WebClient c = new WebClient();
var data = c.DownloadString(baseURL + endPoint + "?access_key=" + accessKey + "¤cies=TWD&source=USD&format=1");
//Console.WriteLine(data);
JObject api = JObject.Parse(data);
string conversion = "";
foreach (var result in api["quotes"])
{
System.Console.WriteLine(result);
conversion = (string)result["USDTWD"];
System.Console.WriteLine(conversion);
}
}
public class ResponseModel
{
public bool Success {get;set;}
....
public List<Quote> Quotes {get;set;}
}
public class QuoteModel
{
public decimal USDTWD {get;set;}
}
公共类响应模型
{
公共bool成功{get;set;}
....
公共列表引号{get;set;}
}
公共类QuoteModel
{
公共十进制USDTWD{get;set;}
}
然后您可以像这样转换为该对象:
public static void apiCall2()
{
WebClient c = new WebClient();
var data = c.DownloadString(baseURL + endPoint + "?access_key=" + accessKey + "¤cies=TWD&source=USD&format=1");
//Console.WriteLine(data);
JObject api = JObject.Parse(data);
string conversion = "";
foreach (var result in api["quotes"])
{
System.Console.WriteLine(result);
conversion = (string)result["USDTWD"];
System.Console.WriteLine(conversion);
}
}
public class ResponseModel
{
public bool Success {get;set;}
....
public List<Quote> Quotes {get;set;}
}
public class QuoteModel
{
public decimal USDTWD {get;set;}
}
var response=api.ToObject();
我不确定这是否为您所接受(例如,您可能没有所有不同的报价,或者没有列出所有报价)。但在我看来,这通常是一种比直接使用JObject更方便的处理回复的方法
另外,您甚至可以使用List as Quotes属性来避免对其进行硬编码,但我不确定如何支持它。简单的方法是:
更改:JObject-api=JObject.Parse(数据);
致:
简单的方法是:
更改:JObject-api=JObject.Parse(数据);
致:
调用
foreach(api[“quotes”]中的var result)时
您正在循环“quotes”JObject
的子对象,其中一个是属性名为“USDTWD”的JProperty
。然后将该JProperty
放在result
变量中。然后:
dynamic api = JObject.Parse(data);
var quote = api.quotes.USDTWD;
您正试图访问result
的USDTWD
属性,但result
没有USDTWD
属性,因为它是USDTWD
属性。因此出现异常
如果您只需要USDTWD
属性的值,可以用以下内容替换foreach循环:
conversion = (string)result["USDTWD"]
调用
foreach(api[“quotes”]中的var result)时
您正在循环“quotes”JObject
的子对象,其中一个是属性名为“USDTWD”的JProperty
。然后将该JProperty
放在result
变量中。然后:
dynamic api = JObject.Parse(data);
var quote = api.quotes.USDTWD;
您正试图访问result
的USDTWD
属性,但result
没有USDTWD
属性,因为它是USDTWD
属性。因此出现异常
如果您只需要USDTWD
属性的值,可以用以下内容替换foreach循环:
conversion = (string)result["USDTWD"]
你能给出一些响应示例吗?这是它调用的JSON文件的链接。我所要做的就是把USDTWD作为一个双精度文件。你能给出一些响应示例吗?这是它调用的JSON文件的链接。我所要做的就是把USDTWD作为一个双精度文件。实际上,如果他愿意的话,他可能直接使用结果迭代所有?@IlyaChernomordik-他可以直接使用
result
。如果quotes
有多个属性,那么在foreach循环中使用result
可能有意义。不过,根据他提供的示例,情况似乎并非如此。我会完全放弃循环,直接获取单个值。嗯,实际上,如果他想遍历所有对象,他可以直接使用result?@IlyaChernomordik-他可以直接使用result
。如果引号
有多个属性,那么在foreach循环中使用result
可能是有意义的。不过,根据他提供的示例,情况似乎并非如此。我将完全放弃循环,直接获取单个值。