Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
角度HttpClient返回字符串数据,而不是解析的JSON_Json_Angular_Angular Httpclient - Fatal编程技术网

角度HttpClient返回字符串数据,而不是解析的JSON

角度HttpClient返回字符串数据,而不是解析的JSON,json,angular,angular-httpclient,Json,Angular,Angular Httpclient,我一直在将代码库从Angular 4.x迁移到5.x的过程中,遇到了一个奇怪的问题。我有一个服务函数,用于将对象列表返回到前端,然后将其转换为特定的数据格式。我知道我需要保留映射,但我有点恼火,因为它只返回纯字符串数据 最初的功能是:(使用刚刚重命名为HttpClient的Http from@angular/Http) 问题是它有点违背了新客户端解析json的目的。response对象是一个字符串,表示我请求的数据的JSON,但它仍然是字符串形式,而不是get()调用中定义的类型 我做错了什么?

我一直在将代码库从Angular 4.x迁移到5.x的过程中,遇到了一个奇怪的问题。我有一个服务函数,用于将对象列表返回到前端,然后将其转换为特定的数据格式。我知道我需要保留映射,但我有点恼火,因为它只返回纯字符串数据

最初的功能是:(使用刚刚重命名为HttpClient的Http from
@angular/Http

问题是它有点违背了新客户端解析json的目的。
response
对象是一个字符串,表示我请求的数据的JSON,但它仍然是字符串形式,而不是
get()
调用中定义的类型

我做错了什么?它不应该已经被解析了吗

Chrome开发工具中的网络工具的响应数据示例:

样本响应主体:

值为
response

后端(C#)响应如下:

      [HttpGet]
        public JsonResult Vendors(bool showAll = false, int screenArea = 0)
        {
            var vendors = _commonBL.GetVendorsSlimForUser(UserModel, UserModel.CustomerId, showAll, screenArea);

            return GetJson(vendors);
        }
这就是它在Http=>HttpClient迁移之前的工作方式,它使用一个
JSON.parse()
返回行中的数据只是一个标准的
列表

,我想引用一个答案。希望它能让我对事情的运作有所了解,仔细阅读它让我明白,这并不容易找到

TypeScript仅在编译时验证对象接口。无法验证代码在运行时获取的任何对象 打字稿

如果是这种情况,那么HttpClient.Get之类的东西就不应该出现 返回T类型的Observable。它应该返回Object类型的Observable,因为 这就是实际返回的内容。试图声明它返回T 当它返回时,对象是误导性的

在文件中,客户的退货部分说明:

@将主体的
可观察的
返回为
键入
T

实际上,文件应说明:

@返回一个可观察到的 可能是
T
。你没有得到回报。如果你得到了T,它会回来的 实际上是T,但不是


这就是数据的原始响应的样子:

[{“Id”:1234,“Name”:“Chris Rutherford”}]
但事实上它看起来是这样的:

“[{\“Id\”:1234,“Name\”:“Chris Rutherford\”}]

因此,在服务器代码的某个地方,您已经应用了两次JSON编码。一旦您纠正了这一点,
HttpClient
将做正确的事情。

默认情况下应该这样做。检查浏览器的调试工具并导航到“网络呼叫”选项卡。查找到该端点的网络呼叫。http头是否包含正确的
内容类型
头和值json?那么响应呢,它是一个数组还是一个包含数组的对象?是的,它返回为application/json,但仍然是一个字符串。您没有回答我评论中的第二个问题。请在您的问题中包括逐字回复消息正文以及回复http标题。网络信息的屏幕截图也是可以接受的。顺便问一下,什么是
GetJson
?这不是
System.Web.Mvc.Controller
上的方法,我也找不到
System.Web.Mvc.Controller
的扩展方法。也许您可以轻松地修复服务器端代码,但您必须在问题中包括如何调用该代码。但什么是
GetJson
?这不是mvc库中包含的调用,因此它可能是代码中的自定义实现。请在您的问题中包括该方法的实现。我可以理解它,直到最后一部分。@ChrisRutherford编辑为可以理解,但请阅读链接文章,它将帮助您详细了解
    public GetVendors(showAll = true, screenArea: number = 0): Observable<Array<SelectModel>> {
        let link = AppSettings.API_COMMON_VENDORS;
        let params: HttpParams = new HttpParams()
            .set('showAll', showAll.toString())
            .set('screenArea', screenArea.toString());

        return this.httpClient.get<Array<any>>(link, {params}).map(response => {
            let list = new Array<SelectModel>();

            response.forEach(vendor => {
                list.push(this.CreateSelectModel(vendor));
            });

            return list;
        });
    }
      [HttpGet]
        public JsonResult Vendors(bool showAll = false, int screenArea = 0)
        {
            var vendors = _commonBL.GetVendorsSlimForUser(UserModel, UserModel.CustomerId, showAll, screenArea);

            return GetJson(vendors);
        }