Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.JSON JSON异步解析_Javascript_Json_Node.js_Asynchronous - Fatal编程技术网

Javascript Node.JSON JSON异步解析

Javascript Node.JSON JSON异步解析,javascript,json,node.js,asynchronous,Javascript,Json,Node.js,Asynchronous,例如,我有一个文件data.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,在解析数据时需要用到它: { "id

例如,我有一个文件data.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,在解析数据时需要用到它:

{
  "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异步(non-blocking,bla-bla)。实际上它不是JSON,我不能使用JSON.parse()方法

请帮帮我。告诉我怎样才能做到。如何解析data.json

UPD:非常感谢丹达维斯!现在我可以解析所有文件并将其用作javascript对象。现在我还有一个问题。在map.json中可以看到“coords”对象。我怎样才能使它成为“坐标”:{“纬度”:“n/a”,“经度”:“n/a”}对吗? 现在我有了这个代码:

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');
我猜这个forEach循环阻塞了一些东西。我可以在另一个线程或smth中创建这些循环吗?或者我不知道有什么建议可以让代码变得非常简单和漂亮?我怎样才能得到我需要的格式的JSON呢?

最后,我做到了

var fs = require('fs');

var data = function(dataFile, mapFile, done) {
  console.log('Function start');
  fs.readFile(dataFile, function(err, dataString) {
    if(err) return done(err);

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

    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);
    });
  });
  console.log('Function end');
};

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

  console.log(JSON.stringify(map));
  console.log('Function success!');
});
最后,我做到了

var fs = require('fs');

var data = function(dataFile, mapFile, done) {
  console.log('Function start');
  fs.readFile(dataFile, function(err, dataString) {
    if(err) return done(err);

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

    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);
    });
  });
  console.log('Function end');
};

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

  console.log(JSON.stringify(map));
  console.log('Function success!');
});

这里有一个简单的解决方案。你可以查一下

var json=require('./test.json')
_=要求('下划线');
风险值数据=[
{键:“0:0:0:1”,val:25},
{键:“0:0:0:2”,val:1},
{键:“0:0:0:3:0”,val:“不适用”},
{键:“0:0:0:3:1”,val:“不适用”},
{键:“0:0:0:4”,val:0},
{键:“0:0:0:5”,val:0}
];
数据=uxby.indexBy(数据,'key');
var match=函数(json){
for(json中的var i){
if(typeof(json[i])=='object'){
匹配(json[i]);
}否则{
for(数据中的var j){
如果(j==json[i]){
json[i]=data[j].val;
}
}
}
}
}
匹配(json);

log(json)这里有一个简单的解决方案。你可以查一下

var json=require('./test.json')
_=要求('下划线');
风险值数据=[
{键:“0:0:0:1”,val:25},
{键:“0:0:0:2”,val:1},
{键:“0:0:0:3:0”,val:“不适用”},
{键:“0:0:0:3:1”,val:“不适用”},
{键:“0:0:0:4”,val:0},
{键:“0:0:0:5”,val:0}
];
数据=uxby.indexBy(数据,'key');
var match=函数(json){
for(json中的var i){
if(typeof(json[i])=='object'){
匹配(json[i]);
}否则{
for(数据中的var j){
如果(j==json[i]){
json[i]=data[j].val;
}
}
}
}
}
匹配(json);

log(json)
为什么不将
data.json
文件设置为实际的json(正如文件结尾所示)?目前,它更像是一个jsonp响应,或者只是一个等待执行的
eval()
ed.data=eval(fs.readFileSync(“json.json”)+“data”)不是“一堆”不必要的逻辑。哎呀;改用fs.readFile…@dandavis:也许它不是“一堆”,但它仍然是不必要的。格式正确的文件是一个更好的选择。@AlexeySlaykovsky:我刚刚测试了OP和我的评论中所示的代码,效果很好。@sholanozie:我同意好的输入是理想的,但OP说这不是一个选项,所以我展示了一个选项……为什么不让你的
data.json
文件成为实际的json呢(正如它的文件结尾已经表明的那样)?目前它更像是一个jsonp响应,或者只是一个等待被
eval()
ed.data=eval(fs.readFileSync(“json.json”)+“数据”)的
.js
脚本,而不是“一堆”不必要的逻辑。哎呀;改用fs.readFile…@dandavis:也许它不是“一堆”,但它仍然是不必要的。格式正确的文件是一个更好的选择。@AlexeySlaykovsky:我刚刚测试了OP和我的评论中所示的代码,效果很好。@sholanozie:我同意好的输入是理想的,但OP说这不是一个选项,所以我展示了一个选项…这不是异步的。@;(它使用JSON.parse,它不是异步的。它使用JSON.parse,它不是异步的