【问题标题】:How to parse a JSON (Google Analytics API 4)如何解析 JSON (Google Analytics API 4)
【发布时间】:2021-06-30 06:59:49
【问题描述】:

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

    "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”中。

//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
    }
}

代码结果:

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

我的理想结果是:

dataTracesAll = [
trace1: {
        name: "ga:sessions",
        x: ['20210623', '20210624']
        y: ['13', '18']
        },
trace2: {
        name: "ga:users",
        x: ['20210623', '20210624']
        y: ['13', '16']      


}
];

【问题讨论】:

  • 请为提供的输入添加预期的输出。

标签: javascript arrays json object


【解决方案1】:

试试这个:

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】:

    我已更新您的逻辑以使其适合您的要求。希望这会奏效。

    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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2021-03-12
      相关资源
      最近更新 更多