Доступ к данным внутри массива JSON с помощью C# - PullRequest
0 голосов
/ 09 июля 2020
• 1000 Я использую Simple JSON для чтения и извлечения JSON. JSON выглядит примерно так:
{
  "coord": {
    "lon": (floating point number),
    "lat": (floating point number)
  },
  "weather": [
    {
      "id": 804,
      "main": "Clouds",
      "description": "overcast clouds",
      "icon": "04n"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 292.01,
    "feels_like": 292.12,
    "temp_min": 291.15,
    "temp_max": 293.15,
    "pressure": 1018,
    "humidity": 72
  },
  "visibility": 9000,
  "wind": {
    "speed": 1.5,
    "deg": 130
  },
  "clouds": {
    "all": 100
  },
  "dt": 1594239812,
  "sys": {
    "type": 1,
    "id": 1308,
    "country": "COUNTRY-CODE",
    "sunrise": 1594178675,
    "sunset": 1594235893
  },
  "timezone": 7200,
  "id": 2954172,
  "name": "CITY",
  "cod": 200
}

Мне нужно получить доступ к «описанию» в массиве «weather». Однако я не мог понять, как заставить его работать. Это мой код C#:

var PARSED_JSON_2 = JSON.Parse(JSON_DATA_2);
var weather_description = PARSED_JSON_2["weather"][2]; //returns null
//I also tried something like this:
var weather_description = PARSED_JSON_2["weather"]["description"][2]; //returns null
var weather_description = PARSED_JSON_2["weather"]["description"][2].Value; //Returns nothing.

Debug.Log покажет пустую строку.

Я пытался следовать этой ссылке здесь: http://wiki.unity3d.com/index.php/SimpleJSON

(Короче говоря, мне нужно получить доступ к элементу внутри массива JSON, но я не могу понять, как это сделать. Любая помощь приветствуется.)

1 Ответ

4 голосов
/ 09 июля 2020

Вы пытаетесь получить доступ к несуществующему индексу 2. В массиве weather есть только один единственный элемент. В этом случае библиотека SimpleJSON просто возвращает null вместо того, чтобы генерировать правильное исключение!

Лучше использовать индекс 0

var weather_description = PARSED_JSON_2["weather"][0];

В общем, вы также можете использовать JsonUtility и десериализовать весь массив в правильное представление класса c#. Тогда вы сразу увидите, сколько элементов имеет / имеет массив / с, или получите ожидаемые исключения должным образом.

Ваш будет выглядеть как

[Serializable]
public class Root
{
    public Coord coord;
    public Weather[] weather;
    public string @base;
    public Main main;
    public int visibility;
    public Wind wind;
    public Clouds clouds;
    public double dt;
    public Sys sys;
    public int timezone;
    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 float feels_like;
    public float temp_min;
    public float temp_max;
    public float pressure;
    public float humidity;
}

[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 string country;
    public int sunrise;
    public int sunset;
}

И тогда вы бы сделали, например,

var root = JsonUtility.FromJson<Root>(JSON_DATA_2);
var weather = root.weather[0];

Большим преимуществом этого подхода будет то, что вы также можете напрямую увидеть результат в Инспекторе Unity, записав его в

public class JsonTester : MonoBehaviour
{
    [Header("Input")]
    [Tooltip("Copy your json string here and call \"Test\" from the Context menu")]
    [SerializeField] [TextArea] private string _testJson;

    [Header("Output")]
    [SerializeField] private Root _receivedJson;

    [ContextMenu(nameof(Test))]
    private void Test()
    {
        VisualizeJson(_testJson);
    }

    public void VisualizeJson(string json)
        JsonUtility.FromJsonOverwrite(json, _receivedJson);
    }
}

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...