Не могу разобрать Json в объектном массиве в Unity (Firebase) - PullRequest
0 голосов
/ 26 мая 2019

Добрый день, я провел все утро, ломая голову, пытаясь передать JSON в массив, используя класс JsonHelper, но безуспешно. Давайте посмотрим, если кто-то бросает кабель, чтобы увидеть, где происходит сбой. Уточните, что я делаю игру в Unity (в случае, если Unity ограничивает код или что-то в этом роде).

Дело в том, что я пытаюсь составить рейтинг с игроками и счетами, которые у меня есть в базе данных в Firebase.

Как вы можете видеть ниже, класс WWW отправил маршрут, а текст, который возвращает www, - это json ниже.

public void Ranking ()
{
    string url = "https://example.firebaseio.com/.json";
    WWW www = new WWW (url);
    StartCoroutine (WaitForRequest (www));
}

IEnumerator WaitForRequest (WWW www)
{
    yield return www;

    // check for errors
    if (www.error == null)
    {
        User[] users;
        users = JsonHelper.FromJson <User> (www.text);

        Debug.Log ("WWW Ok !:" + www.text);
    }
    else
    {
        Debug.Log ("WWW Error:" + www.error);
    }
}

И это возвращаемая строка

{"Eduardito": {"playerName": "Eduardito", "playerScore": "4"}, "Joel": {"playerName": "Joel", "playerScore": "4"}, "Karla": { "playerName": "Karla", "playerScore": "5"}, "Miguelin": {"playerName": "Miguelin", "playerScore": "4"}}

Пока все хорошо, беспорядок прибывает во время использования класса JsonHelper для передачи его в массив. Все время возвращается null. Я не знаю, если это потому, что в классе пользователя что-то не так или нет. Кто-нибудь, кто может что-то придумать? Thanksss! Извините за мой плохой английский

Редактировать: пользовательский класс просто имеет конструктор и две переменные для имени и оценки, ничего более.

Я помещаю класс JsonHelper в

public static class JsonHelper
{
    public static User[] FromJson<User>(string json)
    {
        Wrapper<User> wrapper = JsonUtility.FromJson<Wrapper<User>>(json);

        Debug.Log(wrapper.Items);

        return wrapper.Items;
    }

    public static string ToJson<User> (User[] array)
    {
        Wrapper<User> wrapper = new Wrapper<User> ();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper);
    }

    public static string ToJson <User>(User[] array, bool prettyPrint)
    {
        Wrapper <User> wrapper = new Wrapper<User>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }

    internal static string ArrayToJsonString<T>(User[] res, bool v)
    {
        throw new NotImplementedException();
    }

    [Serializable]
    private class Wrapper<User>
    {
        public User[] Items;
    }
}

1 Ответ

0 голосов
/ 27 мая 2019

Хорошо, давайте начнем с самого начала.JSON, возвращаемый из вашего WWW-запроса, - это не массив, а объект.Поэтому вы должны попытаться изменить формат возврата вашего запроса на что-то вроде:

[{"playerName": "Eduardito", "playerScore": "4"}, {"playerName": "Joel", "playerScore": "4"}]

Теперь это массив!

Затем вы должны быть уверены, что ваш класс User равентакже помечены как сериализуемые, не забывайте это!

Наконец, но не в последнюю очередь, помните, что класс JsonUtility работает только с объектами, поэтому он не сможет десериализовать массив, потому что массив не совсемобъект.Итак, поскольку ваш класс Wrapper содержит параметр с именем Items , JSONUtility будет искать параметр с именем Items в данном JSON.Это можно исправить, изменив функцию JSONHelper.FromJson на что-то вроде:

Wrapper <User> wrapper = JsonUtility.FromJson <Wrapper <User >> ("{\"Items\":" + json + "}");

Таким образом, десериализатор JsonUtility найдет параметр с именем Items и правильно десериализует его в ваш класс-оболочку.

Вот простая версия вашего кода, чтобы вы могли лучше понять, о чем я говорю.Вы можете скопировать и вставить его в свое единство, и оно должно работать правильно.

public class JSONTest : MonoBehaviour
{
    private string jsonStr = "[{\"playerName\": \"Eduardito\", \"playerScore\": \"4\"}, {\"playerName\": \"Joel\", \"playerScore\": \"4\"}]";

    [Serializable]
    public class JSONArray<T>
    {
        public T[] Items;
    }

    [Serializable]
    public class User
    {
        public string playerName;
        public string playerScore;
    }

    void Start()
    {
        JSONArray<User> users = JsonUtility.FromJson<JSONArray<User>>("{\"Items\":" + jsonStr + "}");
        if (users.Items != null && users.Items.Length > 0)
        {
            foreach (User user in users.Items)
            {
                Debug.Log("Deserialized user " + user.playerName);
            }
        }
        else
        {
            Debug.Log("I should never reach this code.");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...