JSON.parse:JSON 数据第 1 行第 50 列的 JSON 数据后出现意外的非空白字符

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

当我使用....

 var jsonData = JSON.parse(xhttp.responseText);

我收到错误=>“JSON.parse:JSON数据第1行第50列的JSON数据后出现意外的非空白字符”

这是我来自 php 脚本的 JSON 数据

{"results":[{"oldID":5,"oldMain":"News papers"}]}{"results":[{"oldID":3,"oldMain":"Construction"}]}{"results":[{"oldID":2,"oldMain":"Banking Files"}]}{"results":[{"oldID":1,"oldMain":"Technologies"}]}

有人可以帮忙吗?...谢谢

php json ajax
7个回答
7
投票

聚会有点晚了,但是@igniz87和@Benjamin James Kippax的答案会让你的网站面临安全问题,效仿他们的例子是非常危险的。 正如 Owasp 所读,

ALWAYS RETURN JSON WITH AN OBJECT ON THE OUTSIDE

因此,为了成为一个免受黑客野蛮行为的保护层,您需要始终让外部原语成为 JSON 字符串的对象。正如您可以清楚地看到的,上述人们的答案并不遵循这一关键的安全规则。

Owasp 还举了个例子,说像下面这样的 JSON 就是

EXPLOITABLE
:

[{"object": "inside an array"}]

但是,以下 JSON 不是,

{"object": "not inside an array"}
{"result": [{"object": "inside an array"}]}

您需要删除重复的关键元素并按以下方式更改它,这样您将在外部拥有一个对象。

{
"results": [{
    "oldID": 5,
    "oldMain": "News papers"
}],
"resultss": [{
    "oldID": 3,
    "oldMain": "Construction"
}]}

在这里,实际上您应该带上 php 代码,因为问题出在发送 JSON 的 php 代码上。当您想要发送 JSON 时,请尝试创建数据数组。我按照以下方式进行。

        $data = [];
        foreach ($results as $res) {
            $t = [];
            $t['oldID'] = $res['oldID'];
            $t['oldMain'] = $res['oldMain'];
            $data[] = $t;
        }
        echo json_encode(['results' => $data]);

你最好发送你的php代码,这里缺少。我的 php 脚本不包含您的所有代码,但它为您提供了如何执行此操作的想法。


6
投票

过去几年我也遇到过同样的问题。 有时问题与无效的 JSON 无关.. 就像我现在一样.. 问题是我必须在

stringify
 之前使用 
JSON.parse

var db = JSON.stringify(data);
var db = JSON.parse(db);

有时在 php 中你必须正确使用

json_encode($data)

有时你的 JSON 无效(在线 JSON 验证器


2
投票

这不是有效的 json,您必须将其包装在数组中。有效的json是这样的

[{
    "results": [{
        "oldID": 5,
        "oldMain": "News papers"
    }]
}, {
    "results": [{
        "oldID": 3,
        "oldMain": "Construction"
    }]
}, {
    "results": [{
        "oldID": 2,
        "oldMain": "Banking Files"
    }]
}, {
    "results": [{
        "oldID": 1,
        "oldMain": "Technologies"
    }]
}]  

看一下 string 开头和结尾处的括号 [ ] 以及用于分割对象的 ,

这是一些在线 json linter here 检查您的 json 是否有效。


1
投票

JSON 无效。如果可能的话,您可以按如下方式更新 JSON

{
"results": [{
    "oldID": 5,
    "oldMain": "News papers"
}],
"resultss": [{
    "oldID": 3,
    "oldMain": "Construction"
}]}

JSON 也不应该包含重复的关键元素。你也可以像这样将 JSON 组合到 JSONArray

[{
    "results": [{
        "oldID": 5,
        "oldMain": "News papers"
    }]
},
{
    "results": [{
        "oldID": 3,
        "oldMain": "Construction"
    }]
}]

0
投票

您的代码无效。

您的代码;

{"results":[{"oldID":5,"oldMain":"News papers"}]}{"results":[{"oldID":3,"oldMain":"Construction"}]}{"results":[{"oldID":2,"oldMain":"Banking Files"}]}{"results":[{"oldID":1,"oldMain":"Technologies"}]}

您的代码已验证;

[{"results":[{"oldID":5,"oldMain":"News papers"}]},
{"results":[{"oldID":3,"oldMain":"Construction"}]},
{"results":[{"oldID":2,"oldMain":"Banking Files"}]},
{"results":[{"oldID":1,"oldMain":"Technologies"}]}]

问题是您有多个 JSON 根元素。这些也没有用逗号分隔。它们还需要用 [] 包装,这会将其变成一个对象。如果您不想将响应包含在 [] 中,则可以返回不带 [] 的字符串,而是执行此操作;

JSON.parse('['+yourreponse+']') which will parse the JSON correctly.

0
投票

以上答案是正确的,即您的 json 语法不正确。纠正你的语法可以解决问题(按照建议)

我的情况有点不同。我返回 json 来响应 ajax 调用。这些 json 由 php 使用 if else 构造返回。我错误地漏掉了另外一个;

if (!empty($_GET['arg1']))
  echo getTrainings($filter, 'arg1');
elseif (!empty($_GET['arg2']))
  echo getTrainings($filter, 'arg2');
if (empty($_GET['arg3']))
  echo getTrainings($filter, 'arg3');
elseif (empty($_GET['arg4']))
  echo getTrainings($filter, 'arg4');

所以实际上返回的是两个 json 而不是一个,这导致了 $.parseJSON(result); 的问题

var par = $.parseJSON(result);

0
投票

我遇到的错误:

我在JS中使用的代码,

const data = {
  OutLatitude: '42.12345',
  OutLongitude: '-71.54321',
};
 const Data = {
                    location: {
                      latitude: JSON.parse(data[0].OutLatitude),
                      longitude: JSON.parse(data[0].OutLongitude),
                    },
                  }

这向我显示了错误,Unexpected non-whitespace character after JSON 位于位置 10(第 1 行第 11 列)处 JSON.parse() 处 _callee4$ (VM7 markattendance.bundle:571:48

解决方案:-

我用来解决JS问题的代码,

const restaurantData = {
  location: {
    latitude: parseFloat(data[0].OutLatitude), // Parse as a floating-point number
    longitude: parseFloat(data[0].OutLongitude), // Parse as a floating-point number
  },
};

Decimal 值转换为 int 显示该错误,通过使用 parseFloat 问题已解决!

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