Как получить данные JSON с помощью «сложной архитектуры»

#javascript #json

#javascript #json

Вопрос:

Я работаю с API, который возвращает довольно конкретный файл JSON … Прошло 2 дня, когда я пытаюсь что-то сделать, но у меня не получается, поэтому я оставляю это вам 🙂

Прежде всего, мой файл JSON выглядит следующим образом:

 [ 
    {
        "_id": 14080,
        "name": "Amulette Séculaire",
        "lvl": "200",
        "type": "Amulette",
        "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/200/1230.png",
        "url": "https://www.dofus.com/fr/mmorpg/encyclopedie/equipements/14080-amulette-seculaire",
        "description": "Finalement, le secteur de la bijouterie n'a pas tellement évolué ces cent dernières années.",
        "stats": [
            {
                "Vitalité": {
                    "from": "251",
                    "to": "300"
                }
            },
            {
                "Intelligence": {
                    "from": "61",
                    "to": "80"
                }
            },
            {
                "Agilité": {
                    "from": "16",
                    "to": "25"
                }
            },
            {
                "Sagesse": {
                    "from": "31",
                    "to": "40"
                }
            },
            {
                "PA": {
                    "from": "1"
                }
            },
            {
                "Prospection": {
                    "from": "16",
                    "to": "20"
                }
            },
            {
                "Dommages Feu": {
                    "from": "8",
                    "to": "12"
                }
            },
            {
                "Dommages Air": {
                    "from": "8",
                    "to": "12"
                }
            },
            {
                "% Résistance Neutre": {
                    "from": "6",
                    "to": "8"
                }
            },
            {
                "% Résistance Feu": {
                    "from": "6",
                    "to": "8"
                }
            },
            {
                "Résistance Critiques": {
                    "from": "11",
                    "to": "15"
                }
            }
        ],
        "condition": [],
        "recipe": [
            {
                "Galet brasillant": {
                    "id": "12740",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/12740-galet-brasillant",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/15289.w48h48.png",
                    "type": "Galet",
                    "lvl": "150",
                    "quantity": "3"
                }
            },
            {
                "Poudre glaciale": {
                    "id": "13154",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13154-poudre-glaciale",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/48292.w48h48.png",
                    "type": "Poudre",
                    "lvl": "190",
                    "quantity": "7"
                }
            },
            {
                "Poil d'aisselle de Missiz Frizz": {
                    "id": "13935",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13935-poil-aisselle-missiz-frizz",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/54691.w48h48.png",
                    "type": "Poil",
                    "lvl": "200",
                    "quantity": "9"
                }
            },
            {
                "Pédoncule de Mérulor": {
                    "id": "13978",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13978-pedoncule-merulor",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/119008.w48h48.png",
                    "type": "Champignon",
                    "lvl": "200",
                    "quantity": "6"
                }
            },
            {
                "Œil de Cycloïde": {
                    "id": "13988",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13988-oeil-cycloide",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/109603.w48h48.png",
                    "type": "Œil",
                    "lvl": "200",
                    "quantity": "30"
                }
            },
            {
                "Queue de Sinistrofu": {
                    "id": "13991",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13991-queue-sinistrofu",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/65764.w48h48.png",
                    "type": "Queue",
                    "lvl": "200",
                    "quantity": "3"
                }
            },
            {
                "Bandelette du Comte Harebourg": {
                    "id": "13995",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13995-bandelette-comte-harebourg",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/15831.w48h48.png",
                    "type": "Ressources diverses",
                    "lvl": "200",
                    "quantity": "1"
                }
            },
            {
                "Œil de verre": {
                    "id": "14145",
                    "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/14145-oeil-verre",
                    "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/109604.w48h48.png",
                    "type": "Œil",
                    "lvl": "200",
                    "quantity": "1"
                }
            }
        ],
        "setId": 271
    }
]
  

На данный момент я извлекаю такие данные:

 for (var i = 0; i < pets.length; i  ) {
            petsTable = {
                name: pets[i].name,
                level: pets[i].lvl,
                type: pets[i].type,
                description: pets[i].description,
                imgUrl: pets[i].imgUrl,
                url: pets[i].url,
                condition: pets[i].condition,
                recipe: pets[i].recipe
            };
  

и для продолжения рецепта я использую массив :

 var petsRecipe = [];

for (var x = 0; x < petsTable.recipe.length; x  ) {
    petsRecipe.push(petsTable.recipe[x]);
}
  

Результат этого массива :
Массив (8) [Объект, Object, Object, Object, Объект, Object, Object, Объект]

И примером первого объекта является :

 0:
Galet brasillant:
id: "12740"
imgUrl: "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/15289.w48h48.png"
lvl: "150"
quantity: "3"
type: "Galet"
url: "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/...
  

Но я не могу собрать идентификатор или «lvl», у вас есть идеи?
Спасибо за вашу помощь

Комментарии:

1. К каким данным вы хотите получить доступ из этого json? какой код вы пробовали?

2. «вот почему я оставляю это вам :)» — Мы хотели бы помочь вам отладить ваши попытки , однако цель StackOverflow не в том, чтобы другие писали ваш код после того, как вы сдались. Рассмотрите возможность редактирования вашего вопроса, чтобы включить некоторые попытки / код.

3. » Это то, что я делаю неправильно? » Откуда мы можем знать? Вы нам ничего не показали!

4. response[0].recipe представляет собой массив, содержащий объекты. У каждого из них есть один ключ, который вы можете получить с помощью Object.keys(obj)[0] .

5. я отредактировал свой пост 🙂

Ответ №1:

Проблема с recipe массивом заключается в том, что каждый объект, который он содержит, имеет структуру, подобную этой :

 {
    "Poudre glaciale": {
        "id": "13154",
        "lvl": "190",
        "quantity": "7"
    }
}
  

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

Вы можете получить доступ к имени ключа («poudre glaciale») с помощью Object.keys(obj)[0] . Тогда вы сможете легко получить доступ к подобъекту :

 const recipe = [{
    "Galet brasillant": {
      "id": "12740",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/12740-galet-brasillant",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/15289.w48h48.png",
      "type": "Galet",
      "lvl": "150",
      "quantity": "3"
    }
  },
  {
    "Poudre glaciale": {
      "id": "13154",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13154-poudre-glaciale",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/48292.w48h48.png",
      "type": "Poudre",
      "lvl": "190",
      "quantity": "7"
    }
  },
  {
    "Poil d'aisselle de Missiz Frizz": {
      "id": "13935",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13935-poil-aisselle-missiz-frizz",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/54691.w48h48.png",
      "type": "Poil",
      "lvl": "200",
      "quantity": "9"
    }
  },
  {
    "Pédoncule de Mérulor": {
      "id": "13978",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13978-pedoncule-merulor",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/119008.w48h48.png",
      "type": "Champignon",
      "lvl": "200",
      "quantity": "6"
    }
  },
  {
    "Œil de Cycloïde": {
      "id": "13988",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13988-oeil-cycloide",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/109603.w48h48.png",
      "type": "Œil",
      "lvl": "200",
      "quantity": "30"
    }
  },
  {
    "Queue de Sinistrofu": {
      "id": "13991",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13991-queue-sinistrofu",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/65764.w48h48.png",
      "type": "Queue",
      "lvl": "200",
      "quantity": "3"
    }
  },
  {
    "Bandelette du Comte Harebourg": {
      "id": "13995",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/13995-bandelette-comte-harebourg",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/15831.w48h48.png",
      "type": "Ressources diverses",
      "lvl": "200",
      "quantity": "1"
    }
  },
  {
    "Œil de verre": {
      "id": "14145",
      "url": "https://www.dofus-touch.com/fr/mmorpg/encyclopedie/ressources/14145-oeil-verre",
      "imgUrl": "https://s.ankama.com/www/static.ankama.com/dofus/www/game/items/52/109604.w48h48.png",
      "type": "Œil",
      "lvl": "200",
      "quantity": "1"
    }
  }
]

const output = recipe.map( obj => {
     let keyName = Object.keys(obj)[0]; // "Galet brasillant", "poudre glaciale", etc.
     
     return obj[keyName]; // the object containing attributes
})

console.log(output[0])  

Редактировать :

Если вам нужен идентификатор «Poudre glaciale», вы должны сделать это :

Сначала отфильтруйте recipe массив, чтобы сохранить только нужный вам объект : recipe.filter( obj => Object.keys(obj)[0] === "Poudre glaciale")

Затем извлеките первый (и единственный) объект из этого отфильтрованного массива с помощью [0]

Затем введите внутри "Poudre glaciale" ключа с ["Poudre glaciale"]

И тогда вы сможете получить доступ к id

Итак, полное решение :

 const id = recipe.filter( obj => Object.keys(obj)[0] === "Poudre glaciale")[0]["Poudre glaciale"].id
  

Комментарии:

1. каков наилучший способ получить идентификатор «poudre glaciale», например?

2. спасибо, и чтобы сделать это динамически, следовало бы заменить «Poudre glaciale» на имя ключа ?