LINUX.ORG.RU

Node.js async JSON parsing

 , , ,


0

1

Здравствуй, о ЛОР!
Вот у меня есть такой data.json, который и не JSON вовсе:

var data = [
  {key: "0:0:0:1", val: 25},
  {key: "0:0:0:2", val: 1},
  {key: "0:0:0:3:0", val: "n/a"},
  {key: "0:0:0:3:1", val: "n/a"},
  {key: "0:0:0:4", val: 0},
  {key: "0:0:0:5", val: 0}
];

Еще у меня есть вот такой map.json, в который мне надо подставить val с data.json вместо «0:0:0:smth»:
{
  "id": "0:0:0:1",
  "type": "0:0:0:2",
  "coords": {
    "latitude": "0:0:0:3:0",
    "longitude": "0:0:0:3:1"
  },
  "unixtime": "0:0:0:4",
  "uptime": "0:0:0:5"
}

И вот такую штуку мне надо получить:
{
  "id":25,
  "type":1,
  "coords": {
    "latitude":"n/a",
    "longitude":"n/a"
  },
  "unixtime":0,
  "uptime":0
}

Предположим, что я распарсил этот data.json, распарсил map.json (не правильно, как выяснилось), подставил в этот map.json все, кроме значений в объект coords, ибо не знаю, как, блин, сделать это. Вот программулина, которая получилась у меня:
var fs = require('fs');

var map = {};
var json = {};

var data = function(data, map) {
  fs.readFile(data, function(err, data) {
    if(err) throw err;

    var evaluated = eval(data+";data");

    evaluated.forEach(function(object) {

      fs.readFile(map, function(err, map) {
        if (err) throw err;

        map = JSON.parse(map, function(key, value) {
          if(object.key === value) {
            console.log(key + " " + object.val);
            json[key] = object.val;
            return(key + " " + object.val);
          }
        });

      console.log(json);
      });
    });
  });
};

data('data.json', 'map.json');

Это нечто выводит мне в терминал:
id 25
{ id: 25 }
uptime 0
{ id: 25, uptime: 0 }
longitude n/a
{ id: 25, uptime: 0, longitude: 'n/a' }
type 1
{ id: 25, uptime: 0, longitude: 'n/a', type: 1 }
latitude n/a
{ id: 25, uptime: 0, longitude: 'n/a', type: 1, latitude: 'n/a' }
unixtime 0
{ id: 25,
  uptime: 0,
  longitude: 'n/a',
  type: 1,
  latitude: 'n/a',
  unixtime: 0 }

Помогите, пожалуйста, понять мне, как заставить node.js вывести мне правильный JSON, который мне так нужен.

  1. Читать один и тот же файл в цикле — плохо.
  2. Документацию к функциям (например, к JSON.parse) читать — хорошо.
var fs = require('fs');

var data = function(dataFile, mapFile, done) {
  fs.readFile(dataFile, function(err, dataString) {
    if(err) return done(err);

    var evaluated = eval(dataString+";data");

    // transform data for convenience
    var data = evaluated.reduce(function (data, item) {
      data[item.key] = item.val;
      return data;
    }, {});

    fs.readFile(mapFile, function (err, mapString) {
      if (err) return done(err);

      var map = JSON.parse(mapString, function (key, value) {
          if (value in data) return data[value];
          return value;
      });

      return done(null, map);
    });
  });
};

data('data.json', 'map.json', function (err, map) {
  if (err) throw err;

  console.log(map);
});
theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Это прямо крутотень

Огромное спасибо, милостивый государь!
Вы спасли мою голову!

slaykovsky ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.