Правильно, метод json () не существует

дал сервис в Angular 4 и извлекаю данные через REST / JSON (новичок в Angular), используя этот код:

Интерфейс

export interface IItem {
    Id: number;
    Title: string;
}

обслуживание

import { IItem } from './item';
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/map';

@Injectable()
export class ItemTest {

    constructor(private _http: HttpClient) {}

    getItems(): Observable<IItem[]> {
        return this._http.get<IItem[]>('url')
            .do(data => {
                console.log(data);
            })
    }
}

Http, приведенный к IITem, работает нормально, если ответ в этом формате

[
    {
        "Id": 53,
        "Title": "Test Document 4.docx"
    },
    {
        "Id": 55,
        "Title": "Test Document 2.docx"
    }
]

Но фактический ответ от сервера выглядит следующим образом, и приведение не работает. Каков наилучший способ приведения части «результатов» ответа к массиву IItems?

{
    "d": {
        "results": [
            {
                "Id": 53,
                "Title": "Test Document 4.docx"
            },
            {
                "Id": 55,
                "Title": "Test Document 2.docx"
            }
        ]
    }
}
 Nillac13 окт. 2017 г., 03:28
@jonrsharpe Я попробовал эту опцию, но компилятор пожаловался, что «Тип '{d: {results: IItem [];};}' нельзя назначить типу« IItem [] »».
 jonrsharpe21 дек. 2017 г., 13:28
Не могли бы вы рассмотреть ответы и рассмотреть возможность принятия моих; это единственный, который на самом деле говорит вам, как решить эту проблему таким образом, чтобы компилятор мог вам помочь, и был помещен ниже ответов, которые являются неполными или неточными.
 jonrsharpe13 окт. 2017 г., 08:16
Да, конечно,потому что это не, Вы не получаете массив, вы получаете объект. Тип get должен описывать форму JSON, которую вы ожидаете получить, а не то, в которую вы собираетесь его преобразовать.
 jonrsharpe12 окт. 2017 г., 21:47
Введите утвержденияне кастинг что угодно. Они просто говорят компилятору, что вы ожидаете. Если вам нужно действительно преобразовать ответ, вы должны сделать это явно, и если вы хотите, чтобы типы были какой-либо помощью, то конкретный тип долженна самом деле соответствует тому, что вы ожидаете, в этом случае.get<{ d: { results: IItem[] } }>(...).
 Jota.Toledo13 окт. 2017 г., 00:46

Ответы на вопрос(3)

Вы хотите использовать оператор карты:

@Injectable()
export class ItemTest {

    constructor(private _http: HttpClient) {}

    getItems(): Observable<IItem[]> {
        return this._http.get('url').map((data) => data['d']['results'])              
            .do(data => {
                console.log(data);
            })
    }
}
 rjustin12 окт. 2017 г., 22:01
@jonrsharpe хороший улов, я просто надеюсь показать, как это сделать. Вероятно, есть и другие причины, по которым он не будет компилироваться.
 jonrsharpe12 окт. 2017 г., 21:55
.get<IItem[]> являетсяне правильно, так что это не удастся скомпилировать
 jonrsharpe13 окт. 2017 г., 08:20
@ Nillac, потому чтоэто неправильный тип, Если вы собираетесь это сделать, вы можете вообще не указывать это.
 Nillac13 окт. 2017 г., 03:21
Это решило проблему с небольшим изменением. Мне пришлось заключить параметры карты в кавычки .map ((data) => data ['d'] ['results']), иначе компилятор пожаловался, что "свойство 'd' не существует для типа 'IItem []'" (Я пытался проголосовать за ответ, но он не отображается)

который вы ожидаете получить. Тогда компилятор можетна самом деле помочь вам сообщая вам, получаете ли вы доступ и возвращаете ли вы нужные вещи. В твоем случае:

getItems(): Observable<IItem[]> {
    return this._http.get<{ d: { results: IItem[] } }>('url')
        .map(response => response.d.results)
        .do(data => {
            console.log(data);
        }):
}

Обратите внимание, что ничего из этого неКастинг данные ответа, простоописывающее Это.

Что касается вашего другого предложения:

.get<IItem[]>(...)
.map((data) => data['d']['results']) 

Если вы собираетесь ошибочно утверждать тип ответа, тогда создайте небезопасный доступ к свойству, и компилятор может только предположить, чтоanyВы также можете вообще не использовать типы. Не игнорируйте компилятор, когда он говорит, что вы обращаетесь к неправильным свойствам.

 jpwrunyan03 авг. 2018 г., 15:49
Странно, я не могу отметить это как ответ. Опция не отображается, хотя она есть для других моих вопросов.
 jonrsharpe03 авг. 2018 г., 15:50
@jpwrunyan а? Вы не задавали этот вопрос.
 Luca31 янв. 2018 г., 14:15
Я не понимаю здесь отрицательных голосов - этот ответ твердый
 jpwrunyan03 авг. 2018 г., 15:52
Это все объясняет. Включая мою амнезию.
 jonrsharpe31 янв. 2018 г., 14:47
@ Лука ценит это, я сделалпопросите ОП рассмотреть но не радость

вы захотите запустить несколько картографических утилит

http.get(url)
.map(response => response.json())
.map(response => response.d.results)
.map(results => results.map(item => return Object.create(IItem, item))
 Jota.Toledo13 окт. 2017 г., 00:42
OP использует API-интерфейс http-клиента, поэтому в ответе отсутствует метод json ().
 Nillac13 окт. 2017 г., 03:20
Правильно, метод json () не существует

Ваш ответ на вопрос