Axios - 如何读取 JSON 响应?

Posted

技术标签:

【中文标题】Axios - 如何读取 JSON 响应?【英文标题】:Axios - How to read JSON response? 【发布时间】:2018-06-12 06:26:35 【问题描述】:

Axios 0.17.1

.then(function (response) 
                console.log(response);
                //console.log(response.status);
                //It is an error -> SyntaxError: Unexpected token u in JSON at position 0 
                console.log(JSON.parse(response.data.error));
                console.log(response.data.error); //undefined.

响应的console.log是

data: ""error":"名称必须输入多个... NULL↵ ["isPipe":protected]=>↵ NULL↵ ↵↵",状态:203,状态文本: “非权威信息”,标题:…,配置:…,… 配置 :适配器:ƒ,transformRequest:…,transformResponse:…,超时: 0, xsrfCookieName: "XSRF-TOKEN", ... data : ""error":"名称必须是 输入多个字符。"object(Slim\Http\Response)#32 (5) ↵ [“状态”:受保护]=>↵ int(200)↵ ["reasonPhrase":protected]=>↵ 字符串(0) ""↵ ["protocolVersion":protected]=>↵ 字符串(3) "1.1"↵ ["headers":protected]=>↵ 对象(Slim\Http\Headers)#33 (1) ↵ ["data":protected]=>↵ 数组(1) ↵ ["content-type"]=>↵ 数组(2)↵ [“值”]=>↵ 数组(1)↵ [0]=>↵ 字符串(24)“文本/html;字符集=UTF-8”↵ ↵ ["originalKey"]=>↵ string(12) "Content-Type"↵ ↵ ↵ ↵ ["body":protected]=>↵ 对象(Slim\Http\Body)#31 (7) ↵ ["stream":protected]=>↵ (stream)类型的资源(59)↵ [“元”:受保护]=>↵ NULL↵ [“可读”:受保护]=>↵ NULL↵ ["writable":protected]=>↵ NULL↵ ["seekable":protected]=>↵ NULL↵ ["size":protected]=>↵ NULL↵ ["isPipe":protected]=>↵ NULL↵ ↵↵" 标头:内容类型: "application/json;charset=utf-8" 请求:XMLHttpRequest onreadystatechange:ƒ,readyState:4,超时:0,withCredentials: 错误,上传:XMLHttpRequestUpload,... 状态:203 statusText: “非权威信息” 原型:对象

JSON.parse(response.data) 以及 response.data.error -> 两者都给出错误。如何读取数据?

Slimframework 3.

$data = array('error' => 'Name must be entered with more than one character.');
        $newResponse = $response->withJson($data, 203);
        return $newResponse;

【问题讨论】:

SyntaxError: 位置 0 处 JSON 中的意外标记 u 检查console.log(response.data) 并查看数据对象的格式。查看您的示例输出,似乎有太多引号 " - data: ""error":"Name must be entered... - this: ""error":" 看起来很奇怪 验证您收到的响应是否为有效的 JSON。如果有效,axios 会将其解析为 JSON 对象。否则它将返回一个纯字符串对象。 【参考方案1】:

在 Axios 中响应已经作为 javascript 对象,无需解析,只需获取响应和访问数据。

【讨论】:

console.log(response.data.error); //undefined - 我可以记录 response.data 但 response.data.error 未定义。无法使用 JSON.parse - 它给了我错误。 这意味着 response.data 存在但没有“错误”键,您可以发布 response.data 的输出吗?通常当 response.error 未定义时,仅仅意味着 axios 响应没有错误。 黄色框(内容)是从 slimframework 收到的响应的 console.log。 - 请检查我是否再次更新。 你能发布 RAW 输出吗? ES:console.log(响应)。如果您使用的是 chrome,我的意思不是网络中的“预览”选项卡,而是“响应”选项卡。 你应该提供一个例子而不是说就做吧【参考方案2】:

假设来自服务器的响应如下所示:

"token": "1234567890"

然后在 Axios 中你可以这样访问它:

console.log( response.data.token )

【讨论】:

【参考方案3】:

我的格式响应与控制台日志中的格式响应类似,我的问题是我的 .json 文件格式不正确。我少了一个逗号。发布您的 json 文件以查看。

【讨论】:

【参考方案4】:

如前所述,Axios 已经默认返回 JSON。只需将 response.data 用作简单的 JS 对象即可。

但是,以下见解可能对其他人有所帮助:我遇到了 Axios 将响应作为字符串返回的问题。经过调查,我发现服务器返回了一个无效的 JSON(它是一个静态文件服务器)。修复 JSON 格式后,Axios 再次使用 JSON 代替字符串。

【讨论】:

【参考方案5】:

axios 通过默认将响应转换为 JSON,您必须使用 response.data 而不是 response

export const addPosts = () => async (dispatch) => 
await axios('https://jsonplaceholder.typicode.com/todos/1')
    .then(response => dispatch(type: postActionTypes.POSTS, payload: response.data))

【讨论】:

【参考方案6】:

你可以简单地得到它,

例如:


    "terms": 

        "title": "usage",

        "message": "this is the usage message"

    


 

当响应看起来像这样时,您可以使用 "response.data" 获取它,等等....

.then(response => 
        console.log( response.data.terms.message)
        
  

干杯!

【讨论】:

【参考方案7】:

这里是示例代码,

try 
  const res = await axios.get("/end-point");
  console.log("JSON data from API ==>", res.data);
 catch (error) 
  // handle error

【讨论】:

【参考方案8】:

我遇到了类似的问题。正如其他人所指出的,axios 将 json 作为 js 对象读取,您可以轻松地在层次结构中移动以获取字段数据。

但是,对我来说,axios 不想将 json 作为对象读取,而是返回一个字符串。原因是由于文件中先前的行删除,json末尾有一个挂逗号。所以文件内容不是有效的 json,axios 只是返回了一个字符串。 去掉逗号,一切正常。

我建议检查 json 是否有任何不正确的语法。

【讨论】:

【参考方案9】:

出于某种原因,在我的情况下,JSON 格式正确,但无论如何都以字符串形式返回。通过这个解决方法,我解决了这个问题。

// ...
return await this.axios_instance.request<T>(
    method,
    url,
    headers,
    params,
    transformResponse: (data) => JSON.parse(data), // <----------
    data,
);

简单地说,我明确要求使用 JSON.parse 转换响应。出于某种原因,这行得通,而其他答案却没有。

这对我有用!希望对您有所帮助。

【讨论】:

【参考方案10】:

所以我发现这篇文章是为了寻找我的问题的答案。 “如何访问 api 返回的 json 文件中的数据。”尽管如此,最终对我有用的是对***上一个类似问题的回答,该问题的链接是Axios. How to get error response even when api return 404 error, in try catch finally。

但是,这是我用来访问后端 api 返回的错误代码的代码。 axios.get(/sanctum/csrf-cookie).then(响应 => axios.post(api/register, registerInfo) .then(响应 => console.log('这是响应:' + response.data.errors); ).catch(错误 => console.log('这是错误:' + error.response.data.errors.name); ); );

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Axios - 如何读取 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章

从控制器读取 json 响应到 Axios Catch 部分 - Laravel Vue Axios

如何使用 nodeJS 从 axios 库中获取有效的 JSON 响应

如何在 React 中查看 axios 错误响应 JSON

如何从 Axios 获取请求中获取响应头参数?

如何修复来自 Axios 的随机 http 请求(404 响应)

如何从 axios 响应对象中的所有项目中提取特定值到 vuex 状态