英文:
How in Unity get JSON data that has many variables in it?
问题
我制作了这个代码,可以在API文本中有一个变量及其值时正常工作,但是当文本如下时,我的脚本不起作用,如何修复?我尝试只获取一个变量,但它不起作用,我得到了null。
我的代码可以使用的API文本:https://catfact.ninja/fact
我的代码不能使用的API文本:https://randomuser.me/api
我编辑了代码以从多个变量的JSON中获取数据,但再次得到了null。
英文:
I made this code that works when API text has one variable and it's value, but when text is like this my script doesn't work, how to fix it? I tryed to get only one variable but it didn't work and i got null.
API text that my code work with: https://catfact.ninja/fact
API text that my code does not work with: https://randomuser.me/api
I edited code to get data from many variables JSON, but again got null:
using UnityEngine;
using TMPro;
using UnityEngine.Networking;
using System.Collections;
using System;
using Newtonsoft.Json;
public class Service : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI _text;
private void Start()
{
StartCoroutine(GetRequest("https://randomuser.me/api"));
}
private IEnumerator GetRequest(String url)
{
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
yield return webRequest.SendWebRequest();
switch (webRequest.result)
{
case UnityWebRequest.Result.ConnectionError:
case UnityWebRequest.Result.DataProcessingError:
_text.text = "Error: " + webRequest.error;
break;
case UnityWebRequest.Result.ProtocolError:
_text.text = "HTTP Error: " + webRequest.error;
break;
case UnityWebRequest.Result.Success:
if (CheckAPI(webRequest))
{
Name name = JsonConvert.DeserializeObject<Name>(webRequest.downloadHandler.text);
if (name.title == null || name.first == null || name.last == null)
{
_text.text = "Error: no information with such variables";
}
else
{
_text.text = name.title + " " + name.first + " " + name.last;
}
}
else
{
_text.text = "Error: there are no API data";
}
break;
}
}
}
private bool CheckAPI(UnityWebRequest data)
{
string contentType = data.GetResponseHeader("Content-Type");
if (!string.IsNullOrEmpty(contentType) && contentType.Contains("application/json"))
{
return true;
}
else
{
return false;
}
}
public class Name
{
public string title { get; set; }
public string first { get; set; }
public string last { get; set; }
}
public void NewRequest()
{
Start();
}
}
答案1
得分: 2
在第一个示例中,您正在使用名为“Fact”的类(我假设)具有以下结构(或类似结构):
public class Fact
{
public string fact { get; set; }
public int length { get; set; }
}
您将JSON反序列化为该对象:
Fact fact = JsonConvert.DeserializeObject<Fact>(webRequest.downloadHandler.text);
但在第二个示例中,响应不同,因此您需要以下类:
public class myNewClass
{
public List<Result> results { get; set; }
public Info info { get; set; }
}
public class Coordinates
{
public string latitude { get; set; }
public string longitude { get; set; }
}
// 其他类的翻译...
并使用以下方式进行反序列化:
myNewClass myDeserializedClass = JsonConvert.DeserializeObject<myNewClass>(webRequest.downloadHandler.text);
当然,将您的主类的名称更改为您想要的任何名称。
英文:
In the first example you are working with a class "Fact" with (I suppose) this structure (or similar):
public class Fact
{
public string fact { get; set; }
public int length { get; set; }
}
and you are deserializating the json to the object with:
Fact fact = JsonConvert.DeserializeObject<Fact>(webRequest.downloadHandler.text);
but in the second example the response is different, so you need these classes:
public class myNewClass
{
public List<Result> results { get; set; }
public Info info { get; set; }
}
public class Coordinates
{
public string latitude { get; set; }
public string longitude { get; set; }
}
public class Dob
{
public DateTime date { get; set; }
public int age { get; set; }
}
public class Id
{
public string name { get; set; }
public string value { get; set; }
}
public class Info
{
public string seed { get; set; }
public int results { get; set; }
public int page { get; set; }
public string version { get; set; }
}
public class Location
{
public Street street { get; set; }
public string city { get; set; }
public string state { get; set; }
public string country { get; set; }
public int postcode { get; set; }
public Coordinates coordinates { get; set; }
public Timezone timezone { get; set; }
}
public class Login
{
public string uuid { get; set; }
public string username { get; set; }
public string password { get; set; }
public string salt { get; set; }
public string md5 { get; set; }
public string sha1 { get; set; }
public string sha256 { get; set; }
}
public class Name
{
public string title { get; set; }
public string first { get; set; }
public string last { get; set; }
}
public class Picture
{
public string large { get; set; }
public string medium { get; set; }
public string thumbnail { get; set; }
}
public class Registered
{
public DateTime date { get; set; }
public int age { get; set; }
}
public class Result
{
public string gender { get; set; }
public Name name { get; set; }
public Location location { get; set; }
public string email { get; set; }
public Login login { get; set; }
public Dob dob { get; set; }
public Registered registered { get; set; }
public string phone { get; set; }
public string cell { get; set; }
public Id id { get; set; }
public Picture picture { get; set; }
public string nat { get; set; }
}
public class Street
{
public int number { get; set; }
public string name { get; set; }
}
public class Timezone
{
public string offset { get; set; }
public string description { get; set; }
}
and deserializate with:
myNewClass myDeserializedClass = JsonConvert.DeserializeObject<myNewClass>(webRequest.downloadHandler.text);
of course, change the name of your main class to whatever you want.
You can work with this or any other case using the following tool:
答案2
得分: 1
如果你只需要一个名称,你可以解析 JSON 字符串并反序列化一个名称属性:
Name name = JObject.Parse(webRequest.downloadHandler.text)["results"][0]["name"]
.ToObject<Name>();
英文:
if you need just a name you can parse a json string and deserilaize a name property
Name name = JObject.Parse(webRequest.downloadHandler.text)["results"][0]["name"]
.ToObject<Name>();
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论