【问题标题】:AJAX / javascript: parsing JSON that contains an arrayAJAX / javascript:解析包含数组的 JSON
【发布时间】:2016-08-02 09:10:22
【问题描述】:

我正在尝试解析我的页面通过 AJAX 响应获得的 JSON 消息,但是它不断抛出以下错误,我不知道为什么:

“SyntaxError: JSON.parse: JSON 数据的数组元素后的预期 ',' 或 ']'”

这是我页面的 javascript 的样子:

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
         var Response = JSON.parse(xhttp.responseText);
    }
}

服务器返回的 JSON 如下所示:

{
    "Error": "",
    "ClientInfo": [{
        "ID": 1,
        "Name": "Bill"
    }, {
        "ID": 2,
        "Name": "Sally"
    }]
}

知道我做错了什么吗? JSON 验证器说它是有效的 JSON....

【问题讨论】:

  • 这是一个有效的 JSON,不会导致该问题。
  • 您是通过检查来自服务器的响应还是通过其他方式获得该 JSON 的?
  • 在解析之前可能是console.log(xhttp.responseText),然后复制控制台输出并通过您的JSON检查器运行它;也许服务器在某处插入了一些错误或额外的字符?
  • @CharlSteynberg 你是对的。看我的回答。

标签: javascript html json ajax


【解决方案1】:

更新

正是 Error: 键使解析器将其吐回。请参阅演示。 更新了演示以包含带有 Error: 的 JSON 以比较结果。不幸的是,我不得不注释掉控制台记录了error JSON,因为调试器立即获取了Script error。幸运的是,演示仍然有效,因此您可以在加载后忽略初始错误。

测试 1

  1. 首先尝试info 按钮。 [结果:莎莉]
  2. 接下来单击error0 按钮。 [结果:莎莉]
  3. 然后试试error1 按钮。 [结果:未定义]

所以它似乎可以解析:

  1. 删除Error:"" 或
  2. 将Error: "" 放在数组中。

测试 2

复制info JSON 然后验证它。 JSONLint

当你使用 JSONLint 时,你必须剥离它:

{
    "ClientInfo": [
        {
            "ID": 1,
            "Name": "Bill"
        },
        {
            "ID": 2,
            "Name": "Sally"
        }
    ]
}

现在复制error JSON 并验证它。

{
    "Error": "",
    "ClientInfo": [{
        "ID": 1,
        "Name": "Bill"
    }, {
        "ID": 2,
        "Name": "Sally"
    }]
}

它们都应该有效,但调试器和解析器拒绝error JSON。

片段

// Prepare JSON
var info =
  '{"ClientInfo": [' +
  '{"ID": 1, "Name": "Bill"},' +
  '{"ID": 2, "Name": "Sally"} ]}';

var error0 =
  '{"ClientInfo": [' +
  '{"ID": 1, "Name": "Bill"},' +
  '{"ID": 2, "Name": "Sally"},' +
  '{"Error": ""} ]}';


var error1 =
  '{"Error": ""},' +
  '{"ClientInfo": [' +
  '{"ID": 1, "Name": "Bill"},' +
  '{"ID": 2, "Name": "Sally"} ]}';


// Create a function that parses JSON Object

function JSONObj(json) {
  var jsonObj = JSON.parse(json);
  return jsonObj;
}

// A function that logs results one at a time so we can compare results

function processLog(result) {
  console.log('Result: ' + result);
}

/* Test info and errors */

var lastClient = JSONObj(info).ClientInfo[1].Name;

var errorA = JSONObj(error0).ClientInfo[1].Name;

var errorB = JSONObj(error1).ClientInfo[1].Name;
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

<ol>
  <li>Remove this: <pre><code>"Error": "",</code></pre>
  </li>
  <li>Separate into segments (see script)</li>
  <li>Wrap each segment with single quotes `'`</li>
  <li>Add a `+` after each segment</li>
</ol>

<button onclick="processLog(lastClient);">info</button>
<button onclick="processLog(errorA);">error0</button>
<button onclick="processLog(errorB);">error1</button>

【讨论】:

  • 即使从我的 JSON 消息中删除“错误”后,我仍然收到错误消息。
  • @Michael 你看到我的演示了吗?我也会用Error : 更新它,你会看到的。
  • 啊。有趣的。我尝试删除它,然后重新保存我的工作(也许我第一次没有保存一些东西),现在它通过了。那么为什么它不喜欢 Error 呢?
  • 服务器可能会将错误附加到数据中,因为它感知到某些错误。它可能是任何东西,安全性、配置、错误等等。很难说。你总是得到带有那个错误键的 JSON 吗?当您剪切和粘贴它时,可能有一个零空间实体,它是一个很容易被忽略的 ASCII 字符。
【解决方案2】:

Json 解析器接受 json 字符串并对其进行解析。你已经有一个 json 对象

【讨论】:

  • 没有json对象这种东西
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多