【问题标题】:Getting Json data from API and Displaying only part of the json in Unity C#从 API 获取 Json 数据并在 Unity C# 中仅显示部分 json
【发布时间】:2019-02-07 03:03:15
【问题描述】:

我无法从this API 获取价格值。我不需要来自 Web URL 的所有 JSON,我只需要 "rate":"3,394.2033" 部分。

API 数据:

{
  "time": {
    "updated": "Feb 6, 2019 22:02:00 UTC",
    "updatedISO": "2019-02-06T16:02:00-06:00",
    "updateduk": "Feb 6, 2019 at 22:02 GMT"
  },
  "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
  "bpi": {
    "USD": {
      "code": "USD",
      "rate": "3,394.2033",
      "description": "United States Dollar",
      "rate_float": 3394.2033
    },
    "XBT": {
      "code": "XBT",
      "rate": "1.0000",
      "description": "Bitcoin",
      "rate_float": 1
    }
  }
}

我的代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class API : MonoBehaviour
{
    private string www = 
    "https://api.coindesk.com/v1/bpi/currentprice/XBT.json";
    public Text responseText;

    public void Request()
    {
        WWW request = new WWW(www);
        StartCoroutine(OnResponse(request));
    }
    private IEnumerator OnResponse(WWW req)
    {
        yield return req;

        responseText.text = req.text;
    }
}

此脚本允许我提取所有 JSON 数据,但我只需要 "rate":"3,394.2033"。更具体地说,只是值 3,394.2033

【问题讨论】:

    标签: c# json api unity3d json.net


    【解决方案1】:

    使用 Json.Net 的 LINQ-to-JSON API (JTokens) 你可以用一行代码做到这一点:

    var rate = (string)JToken.Parse(json).SelectToken("bpi.USD.rate");
    

    小提琴:https://dotnetfiddle.net/Krgejr

    【讨论】:

    • 很好,不知道那个!看起来是 SimpleJSON 的等效替代品
    • 谢谢!最终让它解决这个问题。 :)
    【解决方案2】:

    您可以使用 newtonsoft 并在此处按照此示例进行操作:https://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm

    public class SearchResult
    {
        public string Rate { get; set; }
    }
    
    
    JObject rateSearch = JObject.Parse(MyJsonText);
    
    // get JSON result objects into a list
    IList<JToken> results = rateSearch ["bpi"]["USD"].Children().ToList();
    
    // serialize JSON results into .NET objects
    IList<SearchResult> searchResults = new List<SearchResult>();
    foreach (JToken result in results)
    {
        // JToken.ToObject is a helper method that uses JsonSerializer internally
        SearchResult searchResult = result.ToObject<SearchResult>();
        searchResults.Add(searchResult);
    }
    

    【讨论】:

    • 感谢指导 ;),通过这个例子,这行代码如何从 Newtonsoft 的示例链接中获取标题、内容和 URL? IList&lt;JToken&gt; results = rateSearch ["responseData"]["results"].Children().ToList();
    • 我用你的例子编辑我的答案:rateSearch ["bpi"]["USD"].Children().ToList(); .你可以在这里看到你的 json 格式:jsonformatter.curiousconcept.com
    【解决方案3】:

    你也可以使用来自 Unity 社区的老而金 SimpleJSON

    要在 Unity 中使用 SimpleJSON,您只需将 SimpleJSON.cs 文件复制到资产文件夹内的项目“插件”文件夹中。

    然后做例如

    var json = JSON.Parse(req.text);
    var yourText = json["bpi"]["USD"]["rate"];
    

    调试注意事项

    如果未找到与您预期相反的给定键,则返回 null 而不是引发异常。

    【讨论】:

      【解决方案4】:

      您可以使用 UnityWebRequest.Get 获取 JSON,然后使用库对其进行反序列化(我推荐 NewtonSoft.Json)。

      反序列化 JSON 后,您可以从结果对象中选择要使用的属性。

      我整理了一个教程来做这件事,还有更多。

      https://www.youtube.com/watch?v=Yp8uPxEn6Vg

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 2018-12-21
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多