例如我有这个文件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 async(非阻塞,bla-bla)。它实际上不是JSON,我不能使用JSON.parse()方法。
请帮帮我。告诉我怎么才能做到。我该如何解析data.json?
UPD:非常感谢dandavis!现在我可以解析所有文件并将其用作javascript对象。现在我有另一个问题。在map.json中你会看到" coords"宾语。我怎样才能做到这一点" coords":{"纬度":" n / a","经度":" n /一个" } 对? 现在我有了这段代码: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?
答案 0 :(得分: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!');
});
答案 1 :(得分:-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文件。