Int64 изменяет значение при передаче в функцию с SimpleJSON - PullRequest
0 голосов
/ 18 декабря 2018

Я получаю ID пользователя (int64) из JSON, а затем передаю их в функцию для заполнения пользовательских данных.Однако значение идентификатора JSON я получаю, как только я передаю его через функцию iEnumerator.Любая идея, почему это происходит?

Я напечатал значения и точно знаю, что они являются ожидаемыми значениями JSON, прежде чем передать их.

Я получаю идентификаторы с GetTeachersStudentList и передаю их в PopulateStudentGamesAndTutorial.Словари, которые я использую для хранения идентификаторов и данных, инициализируются непосредственно перед вызовом GetTeachersStudentList.

IEnumerator GetTeachersStudentList()
{
    //get user information from server call 
    Dictionary<string, string> headers = new Dictionary<string,string>();
    headers.Add("Access-Token", PlayerData.accessToken);
    string url = studentURL += "?staffId=" + PlayerData.currentUser.staffId;

    WWW www = new WWW(url, null, headers);

    yield return www;

    StudentListWebResponse = www.text;
    PlayerData.studentList = StudentListWebResponse; 

    //parse json
    JSONArray students = (JSONArray) JSON.Parse(StudentListWebResponse);
    expectedStudentsToPopulate = students.Count;

    //populate each users data 
    for (int i = 0; i < students.Count; i++)
    {
        string userInformation = students[i].ToString();
        JSONObject studentJsonObject = (JSONObject) JSON.Parse(userInformation);
        foreach (var item in studentJsonObject)
        {
            //look for id, then use that id to populate user data
            if (item.Key == "id")
            {
                StartCoroutine(PopulateStudentGamesAndTutorial(item.Value));
            }
        }
    }

    PlayerData.control.Save();
}

IEnumerator PopulateStudentGamesAndTutorial(Int64 id)
{
    //get games with id 
    Dictionary<string, string> headers = new Dictionary<string,string>();
    headers.Add("Access-Token", PlayerData.accessToken);

    string studentGameURL = serverManager.GamesURL(id);
    WWW gamesWWW = new WWW(studentGameURL, null, headers);
    yield return gamesWWW;  
    PlayerData.StudentListWithGames.Add(id, gamesWWW.text);

    //get tutorials with id 
    string tutorialURL = serverManager.TutorialURL(id);
    WWW wwwGetTutorialsCompleted = new WWW(tutorialURL, null, headers);
    yield return wwwGetTutorialsCompleted;
    JSONArray tutorialArray = (JSONArray) JSON.Parse(wwwGetTutorialsCompleted.text);
    List<int> tutorialIDList = new List<int>();
    for (int i = 0; i < tutorialArray.Count; i++)
    {
        tutorialIDList.Add(tutorialArray[i]["id"]); 
    }
    PlayerData.StudentListWithTutorials.Add(id, tutorialIDList);
    PlayerData.control.Save();

1 Ответ

0 голосов
/ 18 декабря 2018

SimpleJSON хранит все простые скалярные значения (такие как логические, числа и строки) в виде строки.Он предоставляет свойства доступа и операторы, позволяющие вам извлекать значение в виде нескольких различных типов.

Так, например:

bool b1 = node.AsBool; 
bool b1 = node; // Calls operator bool which in turn calls AsBool

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

Однако нет автоматического преобразования в Int64.Если вы попытаетесь использовать узел, где ожидается int64, лучшим совпадением будет operator int, которое не будет делать то, что вы хотите.

Решение состоит в том, чтобы передать его как строку и использовать Int64.Parseили Int64.TryParse, чтобы преобразовать его в правильный тип.

...