如何动态获取嵌套在JSON文件中的数据

时间:2019-10-23 15:33:25

标签: javascript json

我正在构建一项功能,该功能可以允许用户键入单词,选择单词所在的语言,然后使用此API service获取单词的定义和示例。

我要获取的数据是“含义”的“感叹号”位置0处的数据。这样,我可以确保用户获得了他们要查找的单词的定义和示例。我的问题是,“定义”和“示例”的数据位置因语言而异。如您所见,下面的一种是英语单词的JSON数据格式。

[{
    "word": "hello",
    "phonetic": [
        "həˈləʊ",
        "hɛˈləʊ"
    ],
    "meaning": {
        "exclamation": [
            {
                "definition": "used as a greeting or to begin a telephone conversation.",
                "example": "hello there, Katie!"
            }
        ]
    }
}]

下面是法语单词的JSON数据格式。

[
    {
        "word": "bonjour",
        "phonetic": "",
        "origin": "",
        "meaning": {
            "nom masculin": {
                "definitions": [
                    {
                        "definition": "Souhait de bonne journée (adressé en arrivant, en rencontrant).",
                        "example": "",
                        "synonyms": [
                            "salut"
                        ]
                    }
                ]
            }
        }
    }
]

当前,我将每个数据的位置存储在变量中,并重复执行此操作,直到到达要尝试获取的最终数据的位置为止。

const firstData = data[0];
const firstDataKeys = Object.keys(firstData);
const meaningsIndex = firstDataKeys.indexOf("meaning");
const meaningsData = firstData[firstDataKeys[meaningsIndex]]
const meaningsKeys = Object.keys(meaningsData);

我想知道当所需数据的位置随每个请求而变化时,是否还有其他方法可以动态获取数据。

2 个答案:

答案 0 :(得分:0)

由于响应对象的结构可以更改,因此可以使用“深度选择”功能。请参见此注释以获取一种干净的函数,例如,该函数可以让您选择属性“ definition”。

https://stackoverflow.com/a/15643382/3347968

例如

const res = findNested(myResponseObj, 'definition');

会导致类似

res = ["Souhait de bonne journée (adressé en arrivan.."].

答案 1 :(得分:0)

Javascript可让您使用JSON.parse直接将JavaScript解析为对象

所以您可以做类似的事情。

const word = "exclamation"
const dict = JSON.parse(json);

//These 2 syntaxes are equivalent
const definition1 = dict["meaning"][word]["definitions"][0];
const definition2 = dict.meaning[word].definitions[0];

如果您不知道该词是否存在,可以执行类似的操作

const word = "exclamation"
const dict = JSON.parse(json);

//These 2 syntaxes are equivalent
const wordInfo = dict.meaning[word];
if(wordInfo)
{
   //you can do something more exotic, but this will only call code if the
   //word exists. 
   for(var i = 0;i < wordInfo.definitions.length;i++)
   {
     console.log(wordInfo.definitions[0])
   }
}