我正在收集一个json集合,我想解析它。 数据显示:
{
"_id" : ObjectId("589ecc1b463ede8cf7be3d17"),
"Q" : "Q1 ?",
"Rates" : [
"Q1-R1",
"Q1-R2",
"Q1-R3",
"Q1-R4"
]
}
{
"_id" : ObjectId("589ecc1b463ede8cf7be3d18"),
"Q" : "Q2 ?",
"Rates" : [
"Q2-R1",
"Q2-R2",
"Q2-R3",
"Q2-R4"
]
}
{
"_id" : ObjectId("589ecc1b463ede8cf7be3d19"),
"Q" : "Q3 ?",
"Rates" : [
"Q3-R1",
"Q3-R2",
"Q3-R3",
"Q3-R4"
]
}
我正在尝试解析:
$.get("/getQesAns", function(data, status){
var obj = JSON.parse(data);
});
但我收到错误:
Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
答案 0 :(得分:1)
不幸的是,您展示的是无效的JSON。这样:
final ScheduledExecutorService executor = Executors.newScheduledThreadPool(size);
final Map<String, Future< >> map = new HashMap<String, Future< >>();
for (final String key : groupMap.keySet()) {
final ObjectCallable objectCallable = new ObjectCallable(par1, par2, par3);
try {
Thread.sleep(50);
} catch (final InterruptedException e) {
LOGGER.error("Error delay in the submit Callable" + e.getMessage());
}
final Future< > result = executor.submit(objectCallable);
}
应该是:
ObjectId("589ecc1b463ede8cf7be3d17")
所以基本上你应该修复你的服务器,这样它就不会发送一些MongoDB内部表示,而是发送有效的JSON,至少如果你希望能用JSON解析器解析它。
如果您无法控制服务器,我担心正在使用正则表达式和字符串替换技术按摩字符串,然后在客户端解析它并将其提供给JSON解析器:
"589ecc1b463ede8cf7be3d17"
还要记住,你在数组的元素之间缺少coma,最后你错过了开始var massagedJSON = someSuperWizardRegexReplaceStuffThatGetsRidOfMongoDBCrap(data);
var obj = JSON.parse(massagedJSON);
并关闭了[
,使它成为一个真实的数组,使{变得复杂{ {1}}功能: - )
答案 1 :(得分:0)
如果“data”已经是一个有效的JSON对象(不是字符串),那么你根本不需要运行parse方法,你可以直接使用它作为一个对象。但是错误表明数据实际上并不是有效的JSON,并且您的样本证明了这一点:
"_id" : ObjectId("589ecc1b463ede8cf7be3d17")
应该是:
"_id" : "589ecc1b463ede8cf7be3d17"
此外,您在顶层有一个对象列表,它们之间没有逗号,它们似乎也不是数组的一部分。
根据您实际尝试表示的内容,这可能是有效版本:
[
{
"_id" : "589ecc1b463ede8cf7be3d17",
"Q" : "Q1 ?",
"Rates" : [
"Q1-R1",
"Q1-R2",
"Q1-R3",
"Q1-R4"
]
},
{
"_id" : "589ecc1b463ede8cf7be3d18",
"Q" : "Q2 ?",
"Rates" : [
"Q2-R1",
"Q2-R2",
"Q2-R3",
"Q2-R4"
]
},
{
"_id" : "589ecc1b463ede8cf7be3d19",
"Q" : "Q3 ?",
"Rates" : [
"Q3-R1",
"Q3-R2",
"Q3-R3",
"Q3-R4"
]
}
]
要回答问题的第二部分,通常可以使用jQuery的每个函数迭代数组:
$.each(data, function(index, obj) {
console.log(obj._id); //just to test
//do whatever other processing you want here
//then to iterate over the rates for this object, just rinse and repeat:
$.each(obj.Rates, function(index, rateObj) {
console.log(rateObj);
//..etc
});
});
答案 2 :(得分:0)
尽管许多人认为eval
存在危险且性能过重,但您可以将其视为一种创意/简单的解决方案。你可以阅读eval
上的论据是邪恶的,并按你的意愿继续进行。
注意:我只使用ES2015作为模板字符串(json)。正如其他人所说,您提供的JSON无效。我添加了方括号和逗号,假设这是您的数据实际返回的方式。
var json = `[{
"_id" : ObjectId("589ecc1b463ede8cf7be3d17"),
"Q" : "Q1 ?",
"Rates" : [
"Q1-R1",
"Q1-R2",
"Q1-R3",
"Q1-R4"
]
},
{
"_id" : ObjectId("589ecc1b463ede8cf7be3d18"),
"Q" : "Q2 ?",
"Rates" : [
"Q2-R1",
"Q2-R2",
"Q2-R3",
"Q2-R4"
]
},
{
"_id" : ObjectId("589ecc1b463ede8cf7be3d19"),
"Q" : "Q3 ?",
"Rates" : [
"Q3-R1",
"Q3-R2",
"Q3-R3",
"Q3-R4"
]
}]`;
function ObjectId(id) {
return id;
}
var result = eval('('+json+')');
result.forEach(function(item) {
console.log(item._id);
});