Node.js JSON 异步解析

问题描述 投票:0回答:3

例如我有这个文件 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 异步(非阻塞,bla-bla)。事实上它不是 JSON,我不能使用 JSON.parse() 方法。

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

UPD:非常感谢 dandavis!现在我可以解析所有文件并将其用作 JavaScript 对象。现在我有另一个问题。在 map.json 中,您会看到“coords”对象。我怎样才能使它 "coords": { "latitude": "n/a", "longitude": "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 循环阻塞了某些东西。我可以在另一个线程或其他线程中制作这些循环吗?或者也许有我不知道的建议让它变得非常简单和漂亮的代码?如何获取我需要的格式的 JSON?

javascript json node.js asynchronous
3个回答
0
投票

终于,我做到了!

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!');
});

0
投票

您所需要的终于在 2023 年成为可能:

https://github.com/mmomtchev/everything-json

如果你好奇为什么这是一个如此大的问题 - 我建议你阅读这篇文章 https://github.com/mmomtchev/everything-json/blob/main/doc/Introduction.md

(我是作者)


-1
投票

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

var json=require('./test.json')
    _=require('underscore');

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}
];
data=_.indexBy(data,'key');
var match=function(json){
	for(var i in json){
		if(typeof(json[i])==='object'){
			match(json[i]);
		}else{
			for(var j in data){
				if(j === json[i]){
					json[i]=data[j].val;
				}
			}
		}
	}
}
match(json);
console.log(json);

“test.json”是提供的示例 json 文件。

© www.soinside.com 2019 - 2024. All rights reserved.