【问题标题】:Modifying JSON data retrieved from an API in Node.js修改从 Node.js 中的 API 检索的 JSON 数据
【发布时间】:2019-02-07 18:08:18
【问题描述】:

所以,我正在努力从https://www.aviationweather.gov/dataserver 中提取数据并将其存储在 mongoDB 中。 API 返回 XML,并且使用节点的 xml2js 模块我可以很容易地将其转换为 JSON 并将其存储在 mongodb 中。但是,xml2js 模块的转换并不是 100% 完美的,我想在事后修改一些输出,但我不知道从哪里开始。我希望有人可以在正确的方向上轻推我。

这是 xml2js 转换的当前 JSON 输出。我已经对相关部分进行了修剪...如果您需要整个内容,请告诉我:

结果如下:

"sky_condition": {
        "$": {
            "sky_cover": "OVC",
            "cloud_base_ft_agl": "1600"
        }

如果有多个结果,它看起来像这样(最多可能是 4 个结果):

"sky_condition": [{
        "$": {
            "sky_cover": "BKN",
            "cloud_base_ft_agl": "1800"
        }
    }, {
        "$": {
            "sky_cover": "OVC",
            "cloud_base_ft_agl": "4100"
        }
    }]

我希望有一种方法可以使它看起来像这样(以及多达 4 个可能的“云层”:

    "sky_condition": [
    {
        "sky_cover": "OVC",
        "cloud_base_ft_agl": "1600"
    }
],

我希望这很清楚,我非常感谢任何对我的帮助。

【问题讨论】:

  • 答案贴在下面,如果我误解了您的需求,请随时提出任何问题。

标签: arrays node.js json


【解决方案1】:

您可以遍历对象的键,并在看到 $ 键时将天空条件推送到数组。

假设 API 返回这个:

let objRet = {
    someKey: "someObject",
    someOtherKey: "someOtherObject",
    "sky_condition": [{
        "$": {
            "sky_cover": "BKN",
            "cloud_base_ft_agl": "1800"
        }
    }, {
        "$": {
            "sky_cover": "OVC",
            "cloud_base_ft_agl": "4100"
        }
    }]
}

然后我们设计一个函数:

function processObj(obj){
  for(let key in obj){
        if(typeof obj[key] == "object"){
            //If content of obj[key] is an object, process it
            processObj(obj[key]);
        }
    if(key == "$"){
        //If key is '$', push the contents of the key to our array of conditions
        skyConditions.push(obj[key]);
    }
  }
}

我们这样称呼:

let skyConditions = [];

processObj(objRet);
objRet["sky_condition"] = skyConditions;

console.log(objRet);

将返回:

{
    someKey: "someObject",
    someOtherKey: "someOtherObject",
    "sky_condition":[
        {
            "sky_cover": "BKN",
            "cloud_base_ft_agl": "1800"
        },{
            "sky_cover": "OVC",
            "cloud_base_ft_agl": "4100"
        }
    ]
}

【讨论】:

  • 这明白了。谢谢!我添加了一些额外的代码来遍历 API 的所有结果,这是一件很棒的事情。干杯!
【解决方案2】:

您可以使用 xml-js 代替 xml2js。它不添加 "$" 键并返回一个整洁的对象,然后您不必创建单独的函数来重构 JSON。 https://www.npmjs.com/package/xml-js

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2020-04-12
    • 2018-09-18
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多