如何用元素数组解析json

时间:2017-02-14 15:45:57

标签: jquery json

我正在收集一个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>)
  1. 该对象出了什么问题?
  2. 如何查看元素(有文档数组,每个文档都有内部数组)

3 个答案:

答案 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);
});