如何使用TypeScript在Angular 2中正确地将对象转换为JSON

Joã*_*iva 47 post json typescript angular

我正在创建一个Angular 2简单的CRUD应用程序,它允许我使用CRUD产品.我正在尝试实现post方法,因此我可以创建一个产品.我的后端是一个ASP.NET Web API.我遇到了一些麻烦,因为在将我的Product对象转换为JSON时,它没有正确执行.预期的JSON应该是这样的:

{
  "ID": 1,
  "Name": "Laptop",
  "Price": 2000
}
Run Code Online (Sandbox Code Playgroud)

但是,从我的应用程序发送的JSON是这样的:

{  
   "product":{  
      "Name":"Laptop",
      "Price":2000
   }
}
Run Code Online (Sandbox Code Playgroud)

为什么在JSON的开头添加"产品"?我该怎么做才能解决这个问题?我的代码:

product.ts

export class Product {

    constructor(
        public ID: number,
        public Name: string,
        public Price: number
    ) { }   
}
Run Code Online (Sandbox Code Playgroud)

product.service.ts

import {Injectable}   from '@angular/core';
import {Http, Response} from '@angular/http';
import { Headers, RequestOptions } from '@angular/http';
import {Observable} from 'rxjs/Observable';

import {Product} from './product';

@Injectable()
export class ProductService {

    private productsUrl = 'http://localhost:58875/api/products';

    constructor(private http: Http) { }

    getProducts(): Observable<Product[]> {
        return this.http.get(this.productsUrl)
            .map((response: Response) => <Product[]>response.json())
            .catch(this.handleError);
    }

    addProduct(product: Product) {                
        let body = JSON.stringify({ product });            
        let headers = new Headers({ 'Content-Type': 'application/json' });
        let options = new RequestOptions({ headers: headers });

        return this.http.post(this.productsUrl, body, options)
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body.data || {};
    }

    private handleError(error: Response) {
        console.error(error);
        return Observable.throw(error.json().error || 'Server Error');
    }
}
Run Code Online (Sandbox Code Playgroud)

创建-product.component.ts

import { Component, OnInit }  from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';

import { Product } from '../product'
import { ProductService } from '../product.service'

@Component({
    moduleId: module.id,
    selector: 'app-create-product',
    templateUrl: 'create-product.html',
    styleUrls: ['create-product.css'],
})
export class CreateProductComponent {

    product = new Product(undefined, '', undefined);
    errorMessage: string;

    constructor(private productService: ProductService) { }

    addProduct() {            
        if (!this.product) { return; }
        this.productService.addProduct(this.product)
            .subscribe(
            product => this.product,
            error => this.errorMessage = <any>error);
    }
}
Run Code Online (Sandbox Code Playgroud)

创建-product.html

<div class="container">
    <h1>Create Product</h1>
    <form (ngSubmit)="addProduct()">
        <div class="form-group">
            <label for="name">Name</label>
            <input type="text" class="form-control" required [(ngModel)]="product.Name" name="Name"  #name="ngModel">
        </div>
        <div class="form-group">
            <label for="Price">Price</label>
            <input type="text" class="form-control" required [(ngModel)]="product.Price" name="Price">
        </div>
        <button type="submit" class="btn btn-default" (click)="addProduct">Add Product</button>
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

Aks*_*Rao 102

在你的product.service.ts中,你正在以错误的方式使用stringify方法.

只是用

JSON.stringify(product) 
Run Code Online (Sandbox Code Playgroud)

代替

JSON.stringify({product})
Run Code Online (Sandbox Code Playgroud)

我检查了你的问题,在此之后它工作得非常好.

  • 可以通过exapmle清楚地看出差异: - 假设product = {'name':'laptop','price':2000}然后,如果你做JSON.stringify(产品),它给出"{"name" :"笔记本电脑","价格":2000}"但如果你做JSON.stringify({product}),这就是"{"product":{"name":"laptop","price":2000}} "所以我希望这两者之间的区别很明显:) (5认同)
  • JSON.stringify(product)和.JSON.stringify({product})之间的区别是什么? (2认同)

Ode*_*ner 24

如果你想要它在实际的JSON中,你将不得不再次解析:

JSON.parse(JSON.stringify(object))
Run Code Online (Sandbox Code Playgroud)


mal*_*dao 14

如果您只想在HTML中的某处输出JSON,则还可以在插值中使用管道.例如:

<p> {{ product | json }} </p>
Run Code Online (Sandbox Code Playgroud)

我并不完全确定它适用于每个AngularJS版本,但它在我的Ionic App(使用Angular 2+)中完美运行.


rin*_*usu 8

因为你再次封装了产品.尝试将其转换为:

let body = JSON.stringify(product); 
Run Code Online (Sandbox Code Playgroud)