首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析JSON ( 4)

如何解析JSON ( 4)
EN

Stack Overflow用户
提问于 2021-06-30 06:59:49
回答 2查看 531关注 0票数 1

我有一个JSON形式的API响应。

代码语言:javascript
复制
    "reports": [
        {
            "columnHeader": {
                "dimensions": [
                    "ga:date"
                ],
                "metricHeader": {
                    "metricHeaderEntries": [
                        {
                            "name": "ga:sessions",
                            "type": "INTEGER"
                        },
                        {
                            "name": "ga:users",
                            "type": "INTEGER"
                        }
                    ]
                }
            },
            "data": {
                "rows": [
                    {
                        "dimensions": [
                            "20210623"
                        ],
                        "metrics": [
                            {
                                "values": [
                                    "13",
                                    "13"
                                ]
                            }
                        ]
                    },
                    {
                        "dimensions": [
                            "20210624"
                        ],
                        "metrics": [
                            {
                                "values": [
                                    "18",
                                    "16"
                                ]
                            }
                        ]
                    }
]}}]}

我需要在一个单独的对象中获取每个度量(metricHeaderEntries)及其值,因此它位于数组"dataTracesAll“中。

代码语言:javascript
复制
//Example of the construction
//dataTracesAll is an array, containing objects with key "trace" + int  

dataTracesAll['trace' + (i+1)] = {
    name: metricsTitles[i].name, //metric title "sessions"
    x: dimensions, //list of dimensions ["20210623", "20210624"]
    y: dataClear //list of metrics for each metrics is separate ["13", "18"]
}


//The full code:
var titles = [];
var dataTracesAll = [];

//raw data
for (var i=0; i < data.reports.length; i++) {
    //get titles
    var metricsTitles = data.reports[i].columnHeader.metricHeader.metricHeaderEntries;
    metricsTitles.forEach(function(title) {
        titles.push(title.name.split("ga:")[1]);
    });
                        
    //values and dates raw
    var dimensions = [];
    var dataClear = [];
    var values = data.reports[i].data.rows;
                        
    //get dates and values
    values.forEach(function(val) {
        dimensions.push(val.dimensions[0]);
        dataClear.push(val.metrics[0].values[0]); //only the first array value is added
    });
    
    //clear values
    console.log(values);
                        
    //constuct array with values
    dataTracesAll['trace' + (i+1)] = {
        name: metricsTitles[i].name,
        x: dimensions,
        y: dataClear
    }
}

守则的结果:

问题是,它只添加了度量值数组的第一个值,而我无法理解如何解析所有内容,因此实际上有两个跟踪。

我的理想结果是:

代码语言:javascript
复制
dataTracesAll = [
trace1: {
        name: "ga:sessions",
        x: ['20210623', '20210624']
        y: ['13', '18']
        },
trace2: {
        name: "ga:users",
        x: ['20210623', '20210624']
        y: ['13', '16']      


}
];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-30 07:19:13

试试这个:

代码语言:javascript
复制
var data = {"reports": [
    {
        "columnHeader": {
            "dimensions": [
                "ga:date"
            ],
            "metricHeader": {
                "metricHeaderEntries": [
                    {
                        "name": "ga:sessions",
                        "type": "INTEGER"
                    },
                    {
                        "name": "ga:users",
                        "type": "INTEGER"
                    }
                ]
            }
        },
        "data": {
            "rows": [
                {
                    "dimensions": [
                        "20210623"
                    ],
                    "metrics": [
                        {
                            "values": [
                                "13",
                                "13"
                            ]
                        }
                    ]
                },
                {
                    "dimensions": [
                        "20210624"
                    ],
                    "metrics": [
                        {
                            "values": [
                                "18",
                                "16"
                            ]
                        }
                    ]
                }
]}}]};

var titles = [];
var dataTracesAll = [];
var length = data.reports[0].data.rows[0].metrics[0].values.length;
//raw data
for (var i=0; i < length; i++) {
//get titles
var metricsTitles = data.reports[0].columnHeader.metricHeader.metricHeaderEntries;
metricsTitles.forEach(function(title) {
    titles.push(title.name.split("ga:")[1]);
});
                    
//values and dates raw
var dimensions = [];
var dataClear = [];
var values = data.reports[0].data.rows;
                    
//get dates and values
values.forEach(function(val) {
    dimensions.push(val.dimensions[0]);
    dataClear.push(val.metrics[0].values[i]);
});
                    
//constuct array with values
dataTracesAll.push({});
dataTracesAll[i]['trace' + (i+1)] = {
    name: metricsTitles[i].name,
    x: dimensions,
    y: dataClear
}

}
console.log(dataTracesAll);

编辑:结果应该是一个数组,因此我相应地更改了代码。

票数 2
EN

Stack Overflow用户

发布于 2021-06-30 08:33:54

我已经更新了你的逻辑,使它适合你的要求。希望这能成功。

代码语言:javascript
复制
const data =
{
  "reports": [
    {
      "columnHeader": {
        "dimensions": [
          "ga:date"
        ],
        "metricHeader": {
          "metricHeaderEntries": [
            {
              "name": "ga:sessions",
              "type": "INTEGER"
            },
            {
              "name": "ga:users",
              "type": "INTEGER"
            }
          ]
        }
      },
      "data": {
        "rows": [
          {
            "dimensions": [
              "20210623"
            ],
            "metrics": [
              {
                "values": [
                  "13",
                  "13"
                ]
              }
            ]
          },
          {
            "dimensions": [
              "20210624"
            ],
            "metrics": [
              {
                "values": [
                  "18",
                  "16"
                ]
              }
            ]
          }
        ]
      }
    }]
}

const dataTracesAll = {};
const report = data.reports[0];

for (var i = 0; i < report.data.rows.length; i++) {
    dataTracesAll[`trace${i + 1}`] = {
        name: report.columnHeader.metricHeader.metricHeaderEntries[i].name,
        x: [],
        y: [],
    }
}
Object.keys(dataTracesAll).forEach((key, index) => {
    for (var i = 0; i < report.data.rows.length; i++) {
        dataTracesAll[key].x.push(report.data.rows[i].dimensions[0]);
        dataTracesAll[key].y.push(report.data.rows[i].metrics[0].values[index]);
    }
})
console.log(dataTracesAll);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68189848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档