Много пустых записей при разборе json - PullRequest
0 голосов
/ 11 января 2019

У меня есть такой json на сервере, и я хочу получить данные "challenge_id" и "render":

enter image description here

Я пытаюсь десериализовать его с помощью SimpleJson следующим образом:

void Start()
{
    string url = "https://xxxxxxxxxxxxxxxxxxxxxxx";

    WWW www = new WWW(url);
    StartCoroutine(WaitForRequest(www));
}
IEnumerator WaitForRequest(WWW www)
{
    yield return www;
    if (www.error == null)
    {
        Debug.Log("WWW Ok!: " + www.text);
        string jsonString = www.text;
        var N = JSON.Parse(jsonString);

        if (name == null)
        {
            Debug.Log("No data converted");
        }
        else
        {
            Debug.Log(N[1]["title"]["rendered"]);
            Debug.Log(N[1]["acf"]["challenge_id"]);

            for (int i = 0; i < jsonString.Length; i++)
            {
                Debug.Log(N[i]["title"]["rendered"]);
                Debug.Log(N[i]["acf"]["challenge_id"]);
            }
        }
    }
    else
    {
        Debug.Log("WWW Error: " + www.error);
    }
}

Но когда я играю в игру, консоль показывает все данные «render» и «challenge_id» и многие другие записи со значением «null».

"Prueba 2 Piratas Challenges" UnityEngine.Debug: Log (Object) "5c2c8da810dd2304e3d3bcd9" UnityEngine.Debug: Log (Object) "Prueba Challenge Piratas" UnityEngine.Debug: Log (Object) "5c24cfa46315fb04ff78c02c" UnityEngine.Debug: Log (Object) "карамбола" UnityEngine.Debug: Log (Object) "5c24cacd6315fb04ff6fce22" UnityEngine.Debug: Log (Object) ноль UnityEngine.Debug: Log (Object) ноль UnityEngine.Debug: Log (Object) ноль UnityEngine.Debug: Log (Object) ноль UnityEngine.Debug: Log (Object) ноль UnityEngine.Debug: Log (Object)

Что я делаю не так? Заранее спасибо!

1 Ответ

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

вы перебираете

for (int i = 0; i < jsonString.Length; i++)
{
    Debug.Log(N[i]["title"]["rendered"]);
    Debug.Log(N[i]["acf"]["challenge_id"]);
}

, поэтому этот блок выполняется jsonString.Length раз ..., что означает для каждого символа в исходном jsonString.

Он не повторяется по длине N - коллекции, которую вы хотите зациклить.


Так что вместо этого используйте

for (int i = 0; i < N.Count; i++)
{
    Debug.Log(N[i]["title"]["rendered"]);
    Debug.Log(N[i]["acf"]["challenge_id"]);
}

или чтобы избежать подобных ошибок

foreach(var n in N)
{
    Debug.Log(n["title"]["rendered"]);
    Debug.Log(n["acf"]["challenge_id"]);
}

Однако я действительно ожидал бы, что вы получите исключение IndexOutOfRangeException при попытке доступа к N[i], если i => N.Length ... но, возможно, это обрабатывается иначе в SimpleJSON .

Обновление

Я обнаружил, что класс JSONObject имеет следующую реализацию:

public override JSONNode this[int aIndex]
{
    get
    {
        if (aIndex < 0 || aIndex >= m_Dict.Count)
            return null;
        return m_Dict.ElementAt(aIndex).Value;
    }
    set
    {
        //...
    }
}

Как вы можете видеть, они просто возвращают null, если индекс выходит за пределы диапазона.

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