JSON Разбор, как получить переменную с неизвестной первой частью? - PullRequest
0 голосов
/ 05 марта 2020

Ниже приведен вывод JSON из API, у меня возникли проблемы при попытке сравнить переменные "last_save", и если профиль имеет большее значение "last_save", установите "profile_id" в качестве переменной. (Я довольно новичок в скрипте java, извините, если я использую неверную терминологию)

Вот код:

function profileID(){
    console.log("Running profileID.")
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
       rawJsonText = this.responseText;
       var parsedText = JSON.parse(rawJsonText);
       console.log(parsedText)
       console.log(playerUUID)
       lastPlayedIslandID = parsedText[0].last_save
       lastPlayedProfileName = parsedText.profile_id
       console.log(nameMC+"'s island ID : "+lastPlayedIslandID);
       console.log(nameMC+"'s island name : "+lastPlayedProfileName);
       slayerZombie();
      }
    };
    xhttp.open("GET", slothpixelAPI+"skyblock/profiles/"+nameMC, true);
    xhttp.send();

}

Это вывод JSON из API:

{
  "5ab88f71d10747aabf643e666c9933b1": {
    "profile_id": "5ab88f71d10747aabf643e666c9933b1",
    "cute_name": "Grapes",
    "first_join": 1578113432038,
    "last_save": 1582337480211,
    "collections_unlocked": 0,
    "members": [
      "4878f8a455e84956b19d4873d837ab93"
    ]
  },
  "4878f8a455e84956b19d4873d837ab93": {
    "profile_id": "4878f8a455e84956b19d4873d837ab93",
    "cute_name": "Coconut",
    "first_join": 1560932868602,
    "last_save": 1583315330184,
    "collections_unlocked": 59,
    "members": [
      "8d32864b3a364035922dd84d5247f483",
      "4878f8a455e84956b19d4873d837ab93"
    ]
  }
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

parsedText - это объект, а не массив, поэтому индексирование чисел не будет работать. Фактически объекты не упорядочивают свои значения так, как вы ожидаете . Используйте Object.keys(parsedText), чтобы получить имена каждого значения в объекте, и переберите их, чтобы узнать, что вам нужно. Есть и другие способы, которыми вы можете выполнять итерацию по объекту .

var parsedText = JSON.parse(rawJsonText);
var parsedKeys = Object.keys(parsedText);
var mostRecentProfile = "";

for(var i = 0; i < parsedKeys.length; i++) {
    if(mostRecentProfile) {
        if(parsedText[mostRecentProfile].last_save < parsedText[parsedKeys[i]].last_save) {
            // Current profile has more recent save
            mostRecentProfile = parsedKeys[i];
        }
    } else { // Set first profile as default
        mostRecentProfile = parsedKeys[i];
    }
}
console.log(parsedText[mostRecentProfile].last_save); // 1583315330184

Более короткий способ сделать это, если вам удобны однострочные, - получить только значения с Object.values(parsedText), сортировка объектов по свойству last_save и выбор первого.

var parsedText = JSON.parse(rawJsonText);
var mostRecentProfile = Object.values(parsedText).sort(function(a, b) {
    // Sort in descending order
    return b.last_save - a.last_save;
})[0].profile_id;
console.log(parsedText[mostRecentProfile].last_save); // 1583315330184
0 голосов
/ 05 марта 2020

Я понял, я думаю, у вас есть только один объект с 2 полями. Я думаю, что ваш parsedText возвращает что-то вроде:


[{
"5ab88f71d10747aabf643e666c9933b1": {"last_save": 1582337480211},
"4878f8a455e84956b19d4873d837ab93": {"last_save": 1583315330184}
}]

И parsedText [0] имеет вид:

{
"5ab88f71d10747aabf643e666c9933b1": {"last_save": 1582337480211},
"4878f8a455e84956b19d4873d837ab93": {"last_save": 1583315330184}
}

Вы можете получить доступ к дочерним элементам, как:

var text = '{"5ab88f71d10747aabf643e666c9933b1": {"last_save": 1582337480211},"4878f8a455e84956b19d4873d837ab93": {"last_save": 1583315330184}}'
obj = JSON.parse(text);
console.log(obj)

console.log(obj["4878f8a455e84956b19d4873d837ab93"]["last_save"])
console.log(obj["5ab88f71d10747aabf643e666c9933b1"]["last_save"])
...