2017-01-28 12 views
1

Я понял странную вещь с моим проектом типа Angular2. У меня есть объекты, входящие в веб-сервис, который имеет тип «Уровень» (он имеет те же свойства, что и Json, исходящие из webservice). Во время выполнения выясняется, что свойства Уровня из webservice имеют заглавные буквы (случай Pascal) в начале, а те, что в моем проекте машинописного текста, имеют небольшие (видимые в инструменте отладки разработчиков браузера).Карта данных webservice правильно в объект машинописного текста (сопоставление объектов с заглавными буквами/паскаль для случая с верблюдом)

Я думаю, мне нужно каким-то образом сопоставить свойства json, а не делать актеры, написав «как уровень []» везде. Как мне это сделать правильно?

Update в отношении вопроса, что я должен разместить код:

(контроллер)

ngOnInit(): void { 
    this.levelsObservable = this.levelsService.getAllLevels(); 
      this.levelsObservable.subscribe(
       data => console.log(data) 
     ); 
    } 

(Service)

observable : Observable<Response>; 
getAllLevels(): Observable<Level[]> { 
    this.observable = this.achievementsService.getAllAchievements(this.allLevelsUrlPart); 
    return this.observable 
    .map((response: Response) => { 
     const srcData = response.json() as Level[]; 
     return srcData;}) 
    .catch(error => this.handleError(error));} 

getAllAchievements(detailPath): Observable<Response> { 
// prepare request url and header 
this.specificUrl = this.webServiceUrl + detailPath; 
this.headers.append('Content-type', 'application/json'); 
let options = new RequestOptions({ headers: this.headers }); 
this.result = this.http.get(this.specificUrl, options) 
.catch(error => this.handleError(error)); 
return this.result;} 

Обновление: Я полированный мой код немного с помощь одного ответа ниже (не интегрирована выше, потому что не является необходимой для решения основной проблемы). Я попытался использовать другой ответ снизу, чтобы добраться до корпусов верблюдов, но он не работал (у меня есть массив, а в массиве - объекты со свойствами, но свойства объекта недоступны с помощью методов итератора).

Обновление: Я наконец-то справился с этим (!) :) Я немного сократил это сообщение и теперь опубликую свое решение ниже. Это точно не самое красивое, но я рад, что его можно найти в течение нескольких часов. Спасибо всем, кто помогает мне с их огромным вкладом!

+0

обновление ваш пост с кодом, с которым мы не можем помочь – Aravind

+0

Вам нужно написать функцию или метод, который берет необработанный объект из JSON и преобразует его в 'Level'. Обратите внимание, что вопросы SO должны иметь [mcve] в них, а не только ссылку на всю кодовую базу в другом месте. – jonrsharpe

+0

Спасибо, jonrsharpe. Можете ли вы объяснить, как это сделать? Итак, где я могу написать эту функцию и где ее лучше всего назвать? Я попытаюсь сделать минимальный пример – Nadine

ответ

0

Итак, наконец ... Я получил решение!Конечно, не самый красивый, но легко понять и сделать с напряженной работы и исследования:

private useLevelProperties (response: any): Level[]{ 
    let levels: Level[] = []; 
    Object.keys(response).forEach((key) => { 
     //create a new object and just take out the json parts needed. The webservice retrieves Pascal case letters, so we 
     //need to convert them into camel case ones. 
     this.level = new Level(response[key]["AchievementId"], response[key]["Image"], 
     response[key]["GrantedTo"], response[key]["GrantedBy"], response[key]["GrantedWhen"], response[key]["Description"], 
     response[key]["Name"], response[key]["CompetitionCode"], response[key]["Number"]); 

     levels[key] = this.level; 
    }); 

    return levels; 
    }; 
0

Вы можете использовать это, чтобы получить объекты нижней части.

modifiedSrc(srcData){ 
    let obj = {}; 
    Object.keys(srcData).forEach((key)=>{ 
     obj[key.uncapitalize()] = srcData[key]; 
    }) 
    return obj 
    } 
    String.prototype.uncapitalize = function() { 
    return this.charAt(0).toLowerCase() + this.slice(1); 
    } 

Затем вы можете вернуть измененные данные

getAllLevels(): Observable<Level[]> { 
    this.observable = this.achievementsService.getAllAchievements(this.allLevelsUrlPart); 
    return this.observable 
    .map((response: Response) => { 
     const srcData = response.json() as Level[]; 
     return this.modifiedSrc(srcData);}) 
    .catch(error => this.handleError(error));} 
+0

Большое спасибо. Теперь я понимаю, где я должен поместить этот материал и как он работает, чтобы получить свойства в случае с верблюдом. Этот подход слишком специфичен для моего варианта использования, потому что может быть, что я хочу иметь только некоторые из свойств json на моем объекте-типе (3 из 10, например) (когда дело доходит до других достижений). Как я могу отобразить свойства? – Nadine

+0

Я не понимаю вас ясно. Можете ли вы объяснить немного больше примером или лучше, добавьте новый вопрос? – raj

+0

Я попытаюсь переформулировать, потому что я думаю, что это слишком много относится к исходному вопросу, чтобы открыть новый: на данный момент мы только преобразуем все свойства объекта JSON прямо в уровень с точно такими же свойствами (кроме верблюда в начале письма). Что делать, если у меня меньше объектов на моем объекте, чем в JSON? Например. У меня есть идентификатор, имя, номер на JSON и хотите, чтобы имя и номер * только * находились на уровне в машинописном тексте? Будет ли это работать так или мне нужно сделать что-нибудь еще, кроме объявления только имени и номера в классе Level? – Nadine

0

Вы осложненных оба ваших methods.Make это просто, как

this.webServiceUrl = "http...." ;  // your service end point address 
this.headers.append('Content-type', 'application/json'); 
let options = new RequestOptions({ headers: this.headers }); 

// For all your error handling 
private handleError(error: Response) { 
     console.log(error); 
     return Observable.throw(error.json().error || 'Internal Server error'); 
} 

Ваш сервисный метод может использовать типажей, который будет вид

getAllLevels(detailPath): Observable<Level[]> { 
    return this.http.get(detailPath, options) 
        .map((response: Response) => <Level[]>response.json()) 
        .catch(this.handleError); 
} 

Ваш компонент должен поднять запрос к службе в

ngOnInit() : void{ 
     this._myService.getAllLevels() 
        .subscribe(levels => this.levels = levels, 
        error =>this.errorMessage =<any> error); 

} 

Ваше объявление переменной должно быть как

levels:Level[]; 
+0

Спасибо за ваш ответ и ваши советы. Я их интегрировал. Тип Кастинг сам по себе не делает трюк (к сожалению). Я думаю, что это из-за большой и маленькой разницы букв. – Nadine

+0

вы имеете в виду ** PascalCase ** и ** camelCase ** – Aravind

 Смежные вопросы

  • Нет связанных вопросов^_^