【问题标题】:How to access nested values of a JSON file when they are nested multiple times嵌套多次时如何访问 JSON 文件的嵌套值
【发布时间】:2021-07-02 21:54:02
【问题描述】:

我有一个类似于下面列出的示例的 JSON 文件。


"SOLAR_SYSTEM": {
      "PLANETS": {
        "PLANET": [
          {
            "NAME": "Mercury",
            "DISTANCE": "57.91km",
            "RADIUS": "2340km",
            "LENGTH_OF_YEAR": "0.24085",
            "DAY": "88",
            "MASS": "0.054",
            "DENSITY": "6.03"
          },
          {
            "NAME": "Earth",
            "DISTANCE": "149.60",
            "RADIUS": "6371",
            "LENGTH_OF_YEAR": "1.000039",
            "DAY": "24",
            "MASS": "1.00",
            "DENSITY": "5.517",
            "SATELLITES": {
              "SATELLITE": {
                "NAME": "Moon",
                "DISTANCE_FROM_PLANET": "384405",
                "ORBIT": "27.322"
              }
            }
          },
          {
            "NAME": "Mars",
            "DISTANCE": "227.9",
            "RADIUS": "3324",
            "LENGTH_OF_YEAR": "1.88089",
            "DAY": "24.5",
            "MASS": "0.107",
            "DENSITY": "4.16",
            "SATELLITES": {
              "SATELLITE": [
                {
                  "NAME": "Phobos",
                  "DISTANCE_FROM_PLANET": "9380",
                  "ORBIT": "0.319"
                },
                {
                  "NAME": "Deimos",
                  "DISTANCE_FROM_PLANET": "23500",
                  "ORBIT": "1.262"
                }

我的问题是如何访问数据,特别是 SATELLITES --> SATELLITE --> 名称、distance_from_planet 和轨道。

我在下面编写的代码用于访问非嵌套数据的数据(行星名称、距离、半径等)。如下所示,我尝试使用条件语句来检查行星是否有卫星,但没有成功。

$(document).ready(function(){

    $.getJSON("./json/planets.json", function(data){

      //Loop to retrieve and put data in for non nested json
      for(i = 0; i < data.SOLAR_SYSTEM.PLANETS.PLANET.length; i++){

        index = i + 1;

        //All fields that aren't nested
        $("#pName" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].NAME);
        $("#pDistance" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].DISTANCE);
        $("#pRadius" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].RADIUS);
        $("#pLength" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].LENGTH_OF_YEAR);
        $("#pDay" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].DAY);
        $("#pMass" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].MASS);
        $("#pDensity" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].DENSITY);

        if(data.SOLAR_SYSTEM.PLANETS.PLANET[i].SATELLITES == null){

            continue;

          }else{

            $("#pSatName_" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].SATELLITES.SATELLITE.NAME);
            $("#pDistanceFP_" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].SATELLITES.SATELLITE.DISTANCE_FROM_PLANET);
            $("#pOrbit_" + index).html(data.SOLAR_SYSTEM.PLANETS.PLANET[i].SATELLITES.SATELLITE.ORBIT);

            //console.log(data.SOLAR_SYSTEM.PLANETS.PLANET[i].SATELLITES.SATELLITE.NAME);

          }
        }

【问题讨论】:

  • 您可以控制 JSON 格式吗?我问,因为卫星的值类型不一致。卫星;有时它是一个对象,有时它是一个数组。它确实应该始终是一个数组,即使只有 1 个条目。
  • @Rory McCrossan 我无法控制 JSON 格式。我的教授就是这样给我的,他们说他们不想改变它。

标签: javascript jquery json


【解决方案1】:

首先,您可以通过对象解构减少大量输入。

let {PLANET} = data.SOLAR_SYSTEM.PLANETS
for(i = 0; i < PLANET.length; i++){
    if(PLANET[i].SATTELITES)
        let {SATTELITE} = PLANET[i].SATTELITES
    else let SATTELITE = null

那么您不必每次都输入整个内容。

就像 Rory 所说的,数据一致性将大有帮助,但如果您无法控制它,您可以检查 SATTELITE 是数组还是对象并适当地访问它。

if(SATTELITE && SATTELITE instanceof Array){
    access = SATTELITE[num][key]
} 
else if(SATTELITE && SATTELITE instanceof Object{
    access = SATTELITE[key]
}

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多