C# 使用UnityWebRequest从API端点接收JSON数据无效

C# 使用UnityWebRequest从API端点接收JSON数据无效,c#,unity3d,json.net,unitywebrequest,C#,Unity3d,Json.net,Unitywebrequest,我正在使用Unity构建一个经济模拟游戏,需要从和API中提取实时汇率。为此,我使用fixer.io。我已经使用UnityWebRequest实现了这一点,请参见下面的代码: using Newtonsoft.Json; using System.Collections; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; public class ExchangeRequest : MonoBehavi

我正在使用Unity构建一个经济模拟游戏,需要从和API中提取实时汇率。为此,我使用fixer.io。我已经使用UnityWebRequest实现了这一点,请参见下面的代码:

using Newtonsoft.Json;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class ExchangeRequest : MonoBehaviour
{
    private string url = "http://data.fixer.io/api/latest?access_key=**********";

    Text exchange;

    public void GetExchangeRates()
    {
        StartCoroutine(MakeRequest());
    }

    IEnumerator MakeRequest()
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log(request.error);
        }
        else
        {
            Debug.Log("Received" + request.downloadHandler.text);
            var Rates = JsonConvert.DeserializeObject<Rates>(request.downloadHandler.text);

            exchange = GameObject.Find("MainText").GetComponent<Text>();
            exchange.text = Rates.ZAR.ToString();
        }
    }
}
Debug.Log(“Received”+request.downloadHandler.text)
返回API数据,但当调用函数时,调试器-中的所有值都显示为0,这会导致字符串更新为“0”

有人能告诉我我做错了什么吗


非常感谢。

所以它实际上非常简单

我试图获取的数据是JSON输出中的一个列表,这就是初始方法不起作用的原因

{
  "disclaimer": "Usage subject to terms: https://openexchangerates.org/terms",
  "license": "https://openexchangerates.org/license",
  "timestamp": 1599411203,
  "base": "USD",
  "rates": {
    "AUD": 1.372721,
    "EUR": 0.844691,
    "GBP": 0.752474,
    "JPY": 106.24548164,
    "USD": 1,
    "ZAR": 16.58301
  }
}
我更新了JSON parsor,以便在JSON输出中包含“rates”列表的类:

public class ExchangeRates
{
    public Rates rates { get; set; }
}

public class Rates
{
    public double AUD { get; set; }
    public double EUR { get; set; }
    public double GBP { get; set; }
    public double JPY { get; set; }
    public double USD { get; set; }
    public double ZAR { get; set; }
}
然后我更新了我的函数以反序列化列表,在其中我可以解析各个费率:

var xr = JsonConvert.DeserializeObject<ExchangeRates>(request.downloadHandler.text);
exchange = GameObject.Find("MainText").GetComponent<Text>();
exchange.text = xr.rates.ZAR.ToString();
var xr=JsonConvert.DeserializeObject(request.downloadHandler.text);
exchange=GameObject.Find(“MainText”).GetComponent();
exchange.text=xr.rates.ZAR.ToString();

现在我可以获取JSON数据了。

您使用的是哪个版本的JSON.net?股票NuGet实现?还是专门为团结而建的?还有,目标平台是什么?默认情况下,Json.net使用动态代码执行,这在某些平台(如iOS)上是不允许的。我使用的Json.Net有一个特定于unity的实现,但没有遇到任何问题:。如果我是你,我会从这里开始。@Basic我正在使用资产存储中最新的JSON.NET For Unity(与您提供的链接相同)。Unity版本2020.1.4f1,目标平台为Windows,体系结构为x86_64。问题不是我能得到的API数据。我假设这是反序列化的问题,因为值显示为0。好的,保证工作但耗时的选项是从项目中删除json.net dll,而不是将json.net源解压缩到项目中。这将允许您进入json.net代码。您应该能够通过提供正确的符号(.pdb)并在VS调试选项中禁用“仅我的代码”来实现同样的效果(但我还没有用Json.Net尝试过,所以不能说它随符号一起提供)。但在陷入这之前。。。尝试用一个double和一个小的硬编码json字符串创建一个最小的测试用例,以确保测试中没有错误。@Basic我找到了问题所在。在我使用的API中,JSON输出中的任何
后面都没有空格,因此它无法实际准备任何数据。我使用了一些示例API进行了测试,只能从那些在
符号ie
“userId”:1之后带有空格的API中获取数据vs
用户名:凯西
“用户名”:“凯西”
对此有什么建议吗?@Basic所以我找到了一个汇率API,在
符号后面有空格,但它在调试器中仍然返回0-此API实际上在调试器中返回数据-我是否遗漏了其他内容?很高兴你找到了,恭喜
var xr = JsonConvert.DeserializeObject<ExchangeRates>(request.downloadHandler.text);
exchange = GameObject.Find("MainText").GetComponent<Text>();
exchange.text = xr.rates.ZAR.ToString();