Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 类型为'的参数;答复';不可分配给类型为';字符串';_Json_Angular_Httpclient_Google Apis Explorer - Fatal编程技术网

Json 类型为'的参数;答复';不可分配给类型为';字符串';

Json 类型为'的参数;答复';不可分配给类型为';字符串';,json,angular,httpclient,google-apis-explorer,Json,Angular,Httpclient,Google Apis Explorer,我有一个我正在做的项目。 其想法是使用angular 4从GoogleBookAPI检索书籍 我正在努力理解如何读取JSON响应,我还在学习。 我在互联网上搜索,在GitHub上找到了这段源代码 我得到以下错误 Argument of type 'Response' is not assignable to parameter of type 'string'. 这条线 let bookResponse = JSON.parse(body); 我不确定我的做法是否正确。 谢谢你的帮助

我有一个我正在做的项目。 其想法是使用angular 4从GoogleBookAPI检索书籍

我正在努力理解如何读取JSON响应,我还在学习。 我在互联网上搜索,在GitHub上找到了这段源代码

我得到以下错误

Argument of type 'Response' is not assignable to parameter of type 'string'.
这条线

  let bookResponse = JSON.parse(body);
我不确定我的做法是否正确。 谢谢你的帮助

下面是我发送HTTP请求的方法

  getBooks(searchparam: any){
let par = new HttpParams();
par.set('q', searchparam);

return this.httpClient.get('https://www.googleapis.com/books/v1/volumes', {
  params : new HttpParams().set('q',searchparam)
}).map(
  (response: Response) => {
    let data = response;

    return data;
  }
);
}

下面是从HTTP请求获取数据并读取JSON响应的方法

  getBook() {

const dataArrya = this.searchForm.get('param').value;

console.log(dataArrya);
this.requestService.getBooks(dataArrya)
  .subscribe(
    response  => {
      this.printData(response)
    //  console.log(this.bookData);
    },
    (error) => console.log(error)
  ); 
}

私有打印数据(res:Response){
让body=res;
let books:Array=new Array();
让bookResponse=JSON.parse(body);
console.log(bookResponse);
console.dir(booksresponse);
对于(让book of bookResponse.items){
书。推({
标题:book.volumeInfo.title,
副标题:book.volumeInfo.subTitle,
类别:book.volumeInfo.categories,
作者:book.volumeInfo.authors,
评级:book.volumeInfo.rating,
pageCount:book.volumeInfo.pageCount,
image:book.volumeInfo.imageLinks==未定义?“”:book.volumeInfo.imageLinks.缩略图,
description:book.volumeInfo.description,
isbn:book.volumeInfo.industryIdentifiers,
previewLink:book.volumeInfo.previewLink
});
}
}

JSON.parse
接受一个字符串,但传递给它的是一个角度的
响应,它是一个对象(不是字符串)。要将角度
响应
转换为字符串,可以对其调用
toString
,如下所示:

let bookResponse = JSON.parse(body.toString());
作为国家

responseType值确定如何解析成功的响应体。如果responseType是默认的json,则结果对象的类型接口可以作为类型参数传递给request()

HttpClient
get
已使用
JSON解析响应。默认情况下,parse
无需调用它两次

结果是普通对象,而不是
响应
(它属于并且在不导入时可能与之混淆)


上面提到的代码使用Angular 2和
Http
,其中的代码不适用于此处
HttpClient
是Angular 4中引入的较新API。
Http
HttpClient
之间的主要实际区别在于后者不需要向请求中添加
.map(response:response=>response.json())

顺便说一句,上面的代码中有一个错误。HttpParams实例是不可变的,应该链接
.set
。这个
par.set('q',searchparam)
不起作用。谢谢Estus,它对我起作用是因为我只有一个参数,但是如果我有更多,那就是一个问题。它起作用是因为你在另一个地方有正确的代码,
params:new-HttpParams().set('q',searchparam)
谢谢你,请帮我这里
let bookResponse = JSON.parse(body.toString());