【问题标题】:How to convert json formatting from Object to Array如何将json格式从对象转换为数组
【发布时间】:2015-06-29 15:52:25
【问题描述】:

另一个问题:P,我正在尝试更改 JSON 数组的输出,但我不知道为什么它不会呈现其他文件。

在下面编辑更好的解释。

抱歉,如果您查看我的要点中的代码,我不是很清楚,data[name] = { 会将所有返回名称呈现到单独的 json 文件中,但是如果我删除 [name] 及其只是 data = { 不会渲染单个文件,并且 all.json 文件是由渲染的 [name] 文件组成的。 希望这能更好地解释它。 您给我的代码将“markets” [] 添加到 all.json 文件中,但没有其他文件 all.json 只有一个返回。 我想从 data[name] = 中删除 [name] 的原因是它将名称添加到每个返回的字符串的开头,例如 { "Bitcoin": {"position": "1", "name" :"Bitcoin",},{"Litecoin": {"position":"2", "name": "Litecoin", } 等等。

所以我想我想要做的是将 [name] 从数据 [name] = 进入 fs.writeFile 函数,只在字符串的开头添加“markets”:仍然能够将单个文件渲染到 all.json 中。

不会呈现单个文件的 Node.js 代码。

这个版本的 all.json 只返回

{"position":"650","name":"Pennies","symbol":"CENT","icon":"pennies.png","market_cap":{"usd":"NaN","btc":"?"},"price":{"usd":"2.26018e-9","btc":"9.05947e-12"},"supply":"","volume":{"usd":"43.9142","btc":"0.176021"},"change1h":"0.05","change24h":"3.77","change1d":"-7.07","timestamp":1435559515.397}

在json文件夹中

http://s21.postimg.org/xm7v01ujr/image.jpg

我想要的是 JSON 格式:

{
    "markets": [
        {
            "position": "1",
            "name": "Bitcoin",
            "symbol": "BTC",
            "icon": "bitcoin.png",
            "market_cap": {
                "usd": "3504403422",
                "btc": "14319000.0"
            },
            "price": {
                "usd": "244.738",
                "btc": "1.0"
            },
            "supply": "14319000",
            "volume": {
                "usd": "13563600",
                "btc": "55523.8"
            },
            "change1h": "0.26",
            "change24h": "1.05",
            "change1d": "1.21",
            "timestamp": 1435401749.236
        },
        {
            "position": "2",
            "name": "Litecoin",
            and so on.......
        }
    ]
}

#!/usr/bin/nodejs
var request = require("request"),
    cheerio = require("cheerio"),
    fs = require("fs");
 
var currencies = ["usd", "btc"];
var currencyExchangeRates = Array();
var data = {};
 
request('http://coinmarketcap.com/all/views/all/', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    $ = cheerio.load(body);
    currencyExchangeRates = $("#currency-exchange-rates").data();
    $("tr").each(function (i) {
    	if (i > 0) {
	var td = $(this).find("td");
        var position = td.eq(0).text().trim();
        var icon = $(this).find("img.currency-logo").attr("src").replace("/static/img/coins/16x16/", "");
	var name = td.eq(1).text().replace("/", "").trim();
        var re = /\s([a-z]|[0-9])+\s/i;
        var supplyText = td.eq(5).text();
        var symbol = td.eq(2).text().trim();
	var marketCap = currencyDictionary(td.eq(3));
        var price = currencyDictionary(td.eq(4).find("a").eq(0));
	var supply = td.eq(5).text().replace(/\D/g, "").trim(); // Replace all non digit characters with nothing
	var volume = currencyDictionary(td.eq(6).find("a").eq(0));
	var change1h = td.eq(7).text().replace("%", "").trim();
        var change24h = td.eq(8).text().replace("%", "").trim();
        var change1d = td.eq(9).text().replace("%", "").trim();
	var timestamp = Date.now() / 1000;
	data = [{
            "position": position,
            "name": name,
            "symbol": symbol,
            "icon": icon,
            "market_cap": marketCap,
            "price": price,
            "supply": supply,
            "volume": volume,
            "change1h": change1h,
            "change24h": change24h,
            "change1d": change1d,
            "timestamp": timestamp
        }];
      }
    });
    writeData();
  }
});
 
function currencyDictionary(item) {
  var resultArray = {};
  currencies.forEach(function(currency) {
    if (currency == "btc") {
      var result = item.data("btc");
    }
    else {
      var result = item.data("usd") / currencyExchangeRates[currency];
    }
    resultArray[currency] = result.toString().replace(/,/g,"");
  });
  return resultArray;
}
 
function writeData() {
    dataDir = "/var/www/coinmarketcap/json/";
    callback = function(error) {
	if (error) {
	    console.log(error);
	}
    };
    for (currency in data) {
    info = data[currency];
    fileName = dataDir + info["symbol"] + ".json";
    fs.writeFile(fileName, JSON.stringify(info), callback);
    }
    fs.writeFile(dataDir + "all.json", JSON.stringify(data), callback);
}

此版本将渲染所有文件,但将 [name] 添加到 all.json

这个版本的json文件夹

http://s16.postimg.org/xicupqi85/image.jpg

JSON 格式为:

{
    "Bitcoin":
  {
    "position": "1",
    "name": "Bitcoin",
    "symbol": "BTC",
    "icon": "bitcoin.png",
    "market_cap": {
      "usd": "3504403422",
      "btc": "14319000.0"
    },
    "price": {
      "usd": "244.738",
      "btc": "1.0"
    },
    "supply": "14319000",
    "volume": {
      "usd": "13563600",
      "btc": "55523.8"
    },
    "change1h": "0.26",
    "change24h": "1.05",
    "change1d": "1.21",
    "timestamp": 1435401749.236
  },
{ 
    "Litecoin": 
  { 
    "position" "2",
    "name": "Bitcoin",
    and so on...
  }
}

#!/usr/bin/nodejs
var request = require("request"),
    cheerio = require("cheerio"),
    fs = require("fs");
 
var currencies = ["usd", "btc"];
var currencyExchangeRates = Array();
var data = {};
 
request('http://coinmarketcap.com/all/views/all/', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    $ = cheerio.load(body);
    currencyExchangeRates = $("#currency-exchange-rates").data();
    $("tr").each(function (i) {
    	if (i > 0) {
	var td = $(this).find("td");
        var position = td.eq(0).text().trim();
        var icon = $(this).find("img.currency-logo").attr("src").replace("/static/img/coins/16x16/", "");
	var name = td.eq(1).text().replace("/", "").trim();
        var re = /\s([a-z]|[0-9])+\s/i;
        var supplyText = td.eq(5).text();
        var symbol = td.eq(2).text().trim();
	var marketCap = currencyDictionary(td.eq(3));
        var price = currencyDictionary(td.eq(4).find("a").eq(0));
	var supply = td.eq(5).text().replace(/\D/g, "").trim(); // Replace all non digit characters with nothing
	var volume = currencyDictionary(td.eq(6).find("a").eq(0));
	var change1h = td.eq(7).text().replace("%", "").trim();
        var change24h = td.eq(8).text().replace("%", "").trim();
        var change1d = td.eq(9).text().replace("%", "").trim();
	var timestamp = Date.now() / 1000;
	data[name] = {
            "position": position,
            "name": name,
            "symbol": symbol,
            "icon": icon,
            "market_cap": marketCap,
            "price": price,
            "supply": supply,
            "volume": volume,
            "change1h": change1h,
            "change24h": change24h,
            "change1d": change1d,
            "timestamp": timestamp
        };
      }
    });
    writeData();
  }
});
 
function currencyDictionary(item) {
  var resultArray = {};
  currencies.forEach(function(currency) {
    if (currency == "btc") {
      var result = item.data("btc");
    }
    else {
      var result = item.data("usd") / currencyExchangeRates[currency];
    }
    resultArray[currency] = result.toString().replace(/,/g,"");
  });
  return resultArray;
}
 
function writeData() {
    dataDir = "/var/www/coinmarketcap/json/";
    callback = function(error) {
	if (error) {
	    console.log(error);
	}
    };
    for (currency in data) {
    info = data[currency];
    fileName = dataDir + info["symbol"] + ".json";
    fs.writeFile(fileName, JSON.stringify(info), callback);
    }
    fs.writeFile(dataDir + "all.json", JSON.stringify(data), callback);
}

【问题讨论】:

    标签: javascript arrays json node.js


    【解决方案1】:

    尝试使用for...in循环

    var data = {
        "Bitcoin":
      {
        "position": "1",
        "name": "Bitcoin",
        "symbol": "BTC",
        "icon": "bitcoin.png",
        "market_cap": {
          "usd": "3504403422",
          "btc": "14319000.0"
        },
        "price": {
          "usd": "244.738",
          "btc": "1.0"
        },
        "supply": "14319000",
        "volume": {
          "usd": "13563600",
          "btc": "55523.8"
        },
        "change1h": "0.26",
        "change24h": "1.05",
        "change1d": "1.21",
        "timestamp": 1435401749.236
      }
    };
    
    var res = {"markets":[]};
    
    for (var prop in data) {
      res.markets.push(data[prop])
    };
    
    document.getElementsByTagName("pre")[0].textContent = JSON.stringify(res, null, 4);
    <pre></pre>

    【讨论】:

    • 不确定你的意思可以将它添加到一个 gist 并编辑我的 gist 上的代码。
    • @NRPatten “不确定你的意思”。在 OP 要求似乎是:“JSON 格式现在是:” -> “希望是:” ?
    • 对不起,上面有更好的解释
    • @NRPatten 仍然不确定需求?原始帖子中的问题似乎是 “JSON 格式现在是:” -> “希望是:” ?也许包括 js、@987654326 的所有部分@在问题?见stackoverflow.com/help/how-to-ask
    • @NRPatten 仍然不确定确切的要求吗? js@js@@js@@js@@js@js“JSON 格式现在是这样的:” -> “希望是:”
    【解决方案2】:

    解决了,必须将 all.json 的 fs.writeFile 移出 writeData 函数,并为 all.json 提供自己的函数,该函数在 writeData 函数完成后调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多