Unity конвертировать www.text в словарь, чтобы получить доступ к значению? - PullRequest
0 голосов
/ 23 января 2019

Хорошо, у меня есть это, которое работает, пытаясь получить данные о погоде - это возвращает строковую версию этого словаря:

Loaded following XML {"coord":{"lon":-118.24,"lat":34.05},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":290.19,"pressure":1027,"humidity":17,"temp_min":288.15,"temp_max":292.55},"visibility":16093,"wind":{"speed":1.27,"deg":20.0024},"clouds":{"all":1},"dt":1548269880,"sys":{"type":1,"id":3694,"message":0.0038,"country":"US","sunrise":1548255306,"sunset":1548292515},"id":5368361,"name":"Los Angeles","cod":200}

Код:

string url = "http://api.openweathermap.org/data/2.5/weather?lat=34.05&lon=-118.24&APPID=33710eba6d9c76286241d779ac1a6d9c";

        WWW www = new WWW(url);
        yield return www;
        if (www.error == null)
        {

            Debug.Log("Loaded following XML " + www.text);

Я хочу получитьописание под "погодой", но не могу понять, как.Выбор одного узла не работает:

print(xmlDoc.SelectSingleNode("cities/list/item/weather/description/@value").InnerText);

Что я могу сделать здесь?

1 Ответ

0 голосов
/ 23 января 2019

В результате получается строка JSON , а не XML

{
    "coord":{
        "lon":-118.24,
        "lat":34.05
    },
    "weather":[
        {
            "id":800,
            "main":"Clear",
            "description":"clear sky",
            "icon":"01d"
        }
    ],
    "base":"stations",
    "main":{
        "temp":290.19,
        "pressure":1027,
        "humidity":17,
        "temp_min":288.15,
        "temp_max":292.55
    },
    "visibility":16093,
    "wind":{
        "speed":1.27,
        "deg":20.0024
    },
    "clouds":{
        "all":1
    },
    "dt":1548269880,
    "sys":{
        "type":1,"id":3694,
        "message":0.0038,
        "country":"US",
        "sunrise":1548255306,
        "sunset":1548292515
    },
    "id":5368361,
    "name":"Los Angeles",
    "cod":200
} 

Если вы хотите получить доступ только к одному или нескольким значениям этого JSON, вам следует использовать SimpleJSON (просто поместите все необходимые сценарии где-нибудь в вашем Assets) и выполните что-то вроде

var N = JSON.Parse(www.text);

var weather = N["weather"];

, и, поскольку weather является массивом ([...]), обращайтесь к отдельным значениям, например, например:

var id = weather[0]["id"];

Осторожно, потому что этот SimpleJson «скрывает» неверные индексы и строки, просто возвращая null вместо того, чтобы вызывать исключение.Это иногда затрудняет отладку (но также может быть изменено в коде кода класса JSON).


Существует также, например, Unity's JsonUtility, но для этого требуется, чтобыВы реализуете весь класс, который представлен строкой JSON.Если вам не нужны все значения, это может привести к большим издержкам при работе с огромными JSON.

Однако, если они вам нужны (при условии простых типов здесь нет enum и т. Д.):

[Serializable]
public class JsonData
{
    public Coord coord;
    public Weather[] weather;
    public string base;
    public Main main;
    public int visibility;
    public Wind wind;
    public Clouds clouds;
    public int dt;
    public Sys sys;
    public int id;
    public string name;
    public int cod;
}

[Serializable]
public class Coord
{
    public float lon;
    public float lat;
}

[Serializable]
public class Weather
{
    public int id;
    public string main;
    public string description;
    public string icon;
}

[Serializable]
public class Main
{
    public float temp;
    public int pressure;
    public int humidity;
    public float temp_min;
    public float temp_max;
}

[Serializable]
public class Wind 
{
    public float speed;
    public float deg;
}

[Serializable]
public class Clouds
{
    public int all;
}

[Serializable]
public class Sys
{
    public int type;
    public int id;
    public float message;
    public string country;
    public int sunrise;
    public int sunset;
}

, а затем

var wholeData = JsonUtility.FromJson<JsonData>(www.text);
var weather = wholeData.weather;
var id = weather.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...