如何使用Vuejs和Axios读取深层JSON数据

时间:2019-09-02 06:50:16

标签: vue.js axios

我将如何读取嵌套在文件内部的深度JSON数据?我尝试了不同的方法,但似乎无法正常工作。

<template>
    <div>
        <div v-for="edu in info" :key="edu">

            <div>{{ edu.section.title }}</div> // this is what im trying to get to work
        </div>

        <div class="card container">
            {{ info }}
        </div>
    </div>
</template>

<script>
    import axios from 'axios';

    export default {
        data() {
            return {
                info: null
            }
        },
        mounted() {
            axios
                .get('./calculus.json') // Data Below
                .then(response => (this.info = response.data.edu))
                .catch(error => console.log(error))
        }
    }
</script>

我的JSON看起来像这样:

{
    "edu": {
        "1": {
            "title": "Title One",
            "subtitle": "Subtitle One",
            "description": "Description One",
            "section": {
                "1": {
                    "title": "Section One Title",
                    "content": "Section One Content"
                }
            }
        },
        "2": {
            "title": "Title Two",
            "subtitle": "Subtitle Two",
            "description": "Description Two",
            "section": {
                "1": {
                    "title": "Section One Title",
                    "content": "Section One Content"
                }
            }
        }
    }
}

如何使用vue-for并在部分中获取数据以使其显示在标题下?例如:title,section> title,section> subtitle等。

2 个答案:

答案 0 :(得分:1)

一种深入浏览对象的方法是在对象(和子对象)条目上累积v-for。

即:

<div v-for="([category, books], catkey) in Object.entries(info)" :key="`category-${catkey}`">
    <div>{{ category }} :</div>
    <div v-for="([num, book], numkey) in Object.entries(books)" :key=`book-${catkey}-${numkey}`>
        <div v-for="([field, value], valkey) in Object.entries(book)" :key=`field-${catkey}-${numkey}-${valkey}`>
            {{ field }} : {{ value }}
        </div>
    </div>
</div>

如果您发现它太冗长,可以尝试展平以使计算数据具有以下结构:

[
    {
        "category": "edu",
        "id": "1",
        "title": "Title One",
        "subtitle": "Subtitle One",
        "description": "Description One",
        "section": {
            "1": {
                "title": "Section One Title",
                "content": "Section One Content"
            }
        }
    }
]

答案 1 :(得分:0)

鉴于每个section也是一个带有怪异数字键的对象,因此您可以按照与info相同的方式进行迭代。

我还建议您在edu绑定中使用可识别的值,而不要使用整个:key对象。

<div v-for="(edu, eduId) in info" :key="eduId">
  <div v-for="(section, sectionId) in edu.section" :key="sectionId">
    {{ section.title }}
  </div>
</div>

如果可能的话,我会更改JSON数据的格式,以使用实际的数组而不是带有数字键的对象。