C# 在C中访问JSON的子值#

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

当我运行这个简单的JSON API调用代码时,我收到一个错误

无法访问Newtonsoft.Json.Linq.JProperty上的子值


USDTWD(在[quotes]中唯一一个部分应该调用double,它返回美元对TWD的汇率,甚至尝试将其作为字符串调用似乎也没有帮助。

我有一个建议,可以通过使用具有结构而不是“raw”的类来解决这个问题JObject。如果创建这样的类:

public static void apiCall2()
{
    WebClient c = new WebClient();
    var data = c.DownloadString(baseURL + endPoint + "?access_key=" + accessKey + "&currencies=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 + "&currencies=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 + "&currencies=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 + "&currencies=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
可能是有意义的。不过,根据他提供的示例,情况似乎并非如此。我将完全放弃循环,直接获取单个值。