Typescript将JSON对象转换为Typescript类

Typescript将JSON对象转换为Typescript类,json,angular,typescript,Json,Angular,Typescript,您好,我正在尝试将JSON对象数组更改为TypeScript类。但是,每次我尝试将Json对象属性分配给typescript属性时,该方法似乎都会崩溃 类型脚本接口 export interface marker { lat: number; lng: number; } 打字法 public markers: marker[]; ngOnInit() { this.mapService.GetPhotosById(this.id).subscribe(resultl

您好,我正在尝试将JSON对象数组更改为TypeScript类。但是,每次我尝试将Json对象属性分配给typescript属性时,该方法似乎都会崩溃

类型脚本接口

export interface marker {
    lat: number;
    lng: number;
}
打字法

public markers: marker[];

ngOnInit() {
    this.mapService.GetPhotosById(this.id).subscribe(resultlisting => {
        this.values = resultlisting;
        console.log(this.values); //SHOW IN PICTURE
        this.ChangetoMarkers(this.values);
    }, error => this.errorMessage = error);
}

ChangetoMarkers(someArray: Observable<any[]>) {

    for (let entry of someArray) {
        let mark: marker;
        mark.lat = Number(entry.latitude); //Attempt to convert to number
        mark.lng = +entry.longitude; //2nd attempt to convert to number
        this.markers.push(mark);
    };
    console.log(this.markers); //DOES NOT REACH THIS
}
公共标记:标记[];
恩戈尼尼特(){
this.mapService.GetPhotosById(this.id).subscribe(resultlisting=>{
this.values=结果列表;
console.log(this.values);//显示在图片中
this.ChangetoMarkers(this.values);
},error=>this.errorMessage=error);
}
更改标记器(someArray:可观察){
for(让输入someArray){
让马克:马克;
mark.lat=Number(entry.latitude);//尝试转换为Number
mark.lng=+entry.longitude;//第二次尝试转换为数字
这个。标记。推(标记);
};
console.log(this.markers);//未到达此位置
}
地图服务

GetPhotosById(id: string): Observable<any> {
    return this.http
        .post(this.config.apiEndpoint + "mapPhotos/" + id)
        .map(this.extractJson).catch(this.handleErrors);

};
private extractJson(res: Response) {
    let data = res.json();
    return data;
}
private handleErrors(error: Response | any) {
    let errMsg: string;
    if (error instanceof Response) {
        const body = error.json() || '';
        const err = body.error || JSON.stringify(body);
        errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
    } else {
        errMsg = error.message ? error.message : error.toString();
    }
    console.log(errMsg);
    return Observable.throw(errMsg);
}
GetPhotosById(id:string):可观察{
返回此文件。http
.post(this.config.apidentpoint+“mapPhotos/”+id)
.map(this.extractJson).catch(this.handleErrors);
};
私有提取JSON(res:Response){
让data=res.json();
返回数据;
}
私有句柄错误(错误:响应|任意){
让errMsg:string;
if(响应的错误实例){
const body=error.json();
const err=body.error | | JSON.stringify(body);
errMsg=`${error.status}-${error.statusText | |'''}${err}`;
}否则{
errMsg=error.message?error.message:error.toString();
}
console.log(errMsg);
返回可观察抛出(errMsg);
}

我已经研究了这个问题,并尝试应用interger cast,但它似乎不起作用。任何建议都很好。

正如毛里西奥·波普在他的评论中指出的那样,您试图访问一个没有价值的变量的属性

changeToMarkers(points: Array<{latitude: number, longitude: number}>) {
  this.markers = entries.map(({latitude: lat, longitude: lng}) => ({
    lat,
    lng
  }));

  console.log(this.markers);
}
changetomarker(点:数组){
this.markers=entries.map({纬度:纬度,经度:lng})=>({
拉特,
液化天然气
}));
console.log(this.markers);
}

不需要进行数字转换,因为纬度和经度的反序列化表示已经是兼容的数值。

正如Mauricio Poppe在其评论中所指出的,您正在尝试访问没有值的变量的属性

changeToMarkers(points: Array<{latitude: number, longitude: number}>) {
  this.markers = entries.map(({latitude: lat, longitude: lng}) => ({
    lat,
    lng
  }));

  console.log(this.markers);
}
changetomarker(点:数组){
this.markers=entries.map({纬度:纬度,经度:lng})=>({
拉特,
液化天然气
}));
console.log(this.markers);
}
不需要数字转换,因为纬度和经度的反序列化表示形式已经是兼容的数值。

请尝试以下操作:

ChangetoMarkers(someArray: any[]) {
    console.log("array",someArray);
    for (let entry of someArray) {
        let mark: marker = {lat: entry.latitude, lng: entry.longitude};
        console.log("mark", mark);
        this.markers.push(mark);
    };
    console.log("markers",this.markers); 
}
它不像Aluan Haddad的那样优雅,但它应该允许您通过在循环前记录someArray、推送前的标记以及推送后的标记来确定问题的具体解决位置,从而确定问题在哪一点上仍然不起作用。

尝试以下方法:

ChangetoMarkers(someArray: any[]) {
    console.log("array",someArray);
    for (let entry of someArray) {
        let mark: marker = {lat: entry.latitude, lng: entry.longitude};
        console.log("mark", mark);
        this.markers.push(mark);
    };
    console.log("markers",this.markers); 
}


它不像Aluan Haddad的那样优雅,但它应该允许您通过在循环前记录someArray、推送前的标记和推送后的this.markers来确定问题的具体解决位置,从而确定在哪一点发生故障。这些不是“JSON对象”但是javascript对象。抛出任何异常?您正在尝试将属性分配给一个没有值的变量,请编写
let marker:marker={}
而不是抛出任何异常。太好了,我马上就会尝试。我很感激你的建议。TypeScriptor非常新,它们不是“JSON对象”,而是javascript对象。抛出任何异常?您正在尝试将属性分配给一个没有值的变量,请编写
let marker:marker={}
而不是抛出任何异常。太好了,我马上就会尝试。我很感激你的建议。typescriptIt非常新,它没有到达console.log(this.markers)语句。@RyeGuy发生了什么?它到达预定地点了吗?请注意,我为惯例稍微更改了名称,请务必更新您的模板(或将名称更改回;)。我非常感谢您的帮助。然而,它似乎没有达到订阅。我将参数更改回Observable@RyeGuy该类型根本不会更改运行时行为。您能否将调用
更改标记的代码添加到您的问题中?需要更多上下文。@RyeGuy请参阅更新的答案。如果这不起作用,您的响应的形状将与您想象的不同。它不会到达console.log(this.markers)语句。@RyeGuy发生了什么?它到达预定地点了吗?请注意,我为惯例稍微更改了名称,请务必更新您的模板(或将名称更改回;)。我非常感谢您的帮助。然而,它似乎没有达到订阅。我将参数更改回Observable@RyeGuy该类型根本不会更改运行时行为。您能否将调用
更改标记的代码添加到您的问题中?需要更多上下文。@RyeGuy请参阅更新的答案。如果这不起作用,你的反应就会和你想象的不同。