【问题标题】:JSON Parse error: Unrecognized token '?' in React NativeJSON 解析错误:无法识别的令牌“?”在 React Native 中
【发布时间】:2018-04-29 08:03:27
【问题描述】:

我正在开发 React Native 项目,我尝试将数据从服务器转换为 JSON。 我已经在其他项目上做过,所以我知道它是如何工作的,但是这次我有一个错误: “JSON 解析错误:无法识别的令牌 '”。

这是我的代码:

fetch('https://app.fr', {
        method: 'POST',
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded',
        }),
    })
        .then((response) => response.json())

当我改为执行 response.text() 时,我得到一个正确 JSON 格式的字符串。所以我知道数据不是问题。

fetch('https://app.fr', {
        method: 'POST',
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded',
        }),
    })
.then((response) => response.text())

查看论坛后,我发现错误可能是服务器向我发送内容类型为“text/html”而不是“application/json”的数据。是的,服务器向我发送内容类型为“text/html”的数据

所以我尝试更改标题中的内容类型:

 fetch('https://app.fr', {
        method: 'POST',
        headers: new Headers({
            'Content-Type': 'application/json',
        }),
    })
        .then((response) => response.json())

但我得到了那个错误:“JSON Parse error: Unrecognized token '?'

所以我认为这意味着我需要直接更改服务器上数据的内容类型。但我不能这样做,因为我的客户正在将这些数据用于其他项目。

您是否知道任何可能转换为“text/html”内容类型的 JSON 数据而不会出现此类错误?

谢谢!

【问题讨论】:

  • 问题与您的服务器响应有关,而不是与Content-Type 有关。服务器以 html 响应。您是在控制服务器代码还是在使用第三方 api?如果它是第三方 api,您很可能会收到响应错误。在返回response.json() 之前检查response.status,看看你是否得到了正常的响应。 Related post
  • 感谢您的回答!我无法控制服务器代码和 response.status 给我 200 所以我认为没关系
  • 如果 api 在请求成功时返回 html 内容,那么您需要以某种方式解析 html,然后将其转换为 json 或您可以使用的其他类型的数据。我认为你应该开始研究这一点。
  • 问题是返回的不是html内容而是json内容。请参阅下面的答案

标签: json parsing react-native


【解决方案1】:

事实上,我有一些 POST 参数要发送。见下文:

fetch('https://app.fr', {
    method: 'POST',
    headers: new Headers({
        'Content-Type': 'application/x-www-form-urlencoded',
    }),
    body: "tab_mobile=2",
})
 .then((response) => response.text())

如果我将 tab_mobile 设置为 1,我会得到:

{"message":"ok","tests":[{"id":"54","token":"6604","id_test":"20","Nom_prenom":"Alain DUPONT","Titre_du_test":"SIT 212 situation 1","fait":"0"},{"id":"55","token":"5066","id_test":"21","Nom_prenom":"Alain DUPONT","Titre_du_test":"SIT 212 situation 2","fait":"0"}]} 

如果我将 tab_mobile 设置为 2,我会得到:

 {"message":"error"}

我尝试用

解析这些 JSON
JSON.parse(response.text())

如果 tab_mobile = 1,我得到 "JSON Parse error: Unrecognized token '。 但是,如果我将 tab_mobile 设置为 2,则不会出现错误。我可以做事

alert(JSON.parse(response.text()).message)

并打开一个带有“错误”的窗口。

总结: 当我得到 {"message":"error"} 时,我可以将其解析为 JSON,因此我可以认为发送的数据是正确的 JSON 格式。 但是当我得到完整的数据 {"message":"ok", tests: [{...},{...}]} 时,我无法将其解析为 JSON。

你对我能做什么有一些想法吗?

【讨论】:

  • 您是否尝试在 POST 请求中设置“Accept”标头?在标题中尝试输入:“Accept”:“application/json;”此标头表示您希望以 JSON 格式接收数据,内容类型标头仅表示您在正文字段中发送的格式。
  • 也许问题不在客户端,也许是服务器端,服务器能够以 JSON 格式发送数据吗?您是否尝试过与其他客户端相同的 HTTP 方法? (不是你的程序)。
【解决方案2】:

我找到了问题!

在客户端发送给我的数据中,有一个不可见的第一个字符。 当我在手机上渲染它时,我看到了 "{"message":"ok","testes":...} 但是当我将它登录到我的控制台时,我看到第一个 "{" 之前有一个奇怪的字符. 我用 response.text().substring(1) 删除了它,它有效!

感谢您的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多