Ống Angular 2 chuyển đổi đối tượng JSON thành JSON được in đẹp mắt


99

Cố gắng viết một đường ống Angular 2 sẽ lấy một chuỗi đối tượng JSON và trả về nó được in / định dạng đẹp để hiển thị cho người dùng.

Ví dụ, nó sẽ là:

{"id": 1, "number": "K3483483344", "state": "CA", "active": true}

Và trả lại thứ gì đó trông giống như thế này khi được hiển thị trong HTML:

nhập mô tả hình ảnh ở đây

Vì vậy, theo quan điểm của tôi, tôi có thể có một cái gì đó như:

<td> {{ record.jsonData | prettyprint }} </td>

1
có vẻ như bạn muốn tạo một đường ống tùy chỉnh. đây là một số tài liệu: angle.io/docs/ts/latest/guide/pipes.html#!#custom-pipes . hãy dùng thử và nếu bạn gặp vấn đề, vui lòng đăng một câu hỏi cụ thể hơn
danyamachine

Câu trả lời:


301

Tôi muốn thêm một cách đơn giản hơn để thực hiện việc này, sử dụng jsonđường ống tích hợp:

<pre>{{data | json}}</pre>

Bằng cách này, định dạng được giữ nguyên.


Cảm ơn điều này là hoàn hảo!
đoạt giải thưởng

5
Rõ ràng đến nỗi tôi đã cho bạn một điểm vì tôi xấu hổ vì đã tìm kiếm nó: p
Capy

1
@Shane Hsu, ống json tích hợp không hoạt động. Tôi đang sử dụng chuỗi để làm cho json đẹp. Vui lòng đi qua liên kết này mà tôi đã nêu câu hỏi. stackoverflow.com/questions/57405561/…
Venkateswaran R

Vì vậy, nó có phân biệt chữ hoa chữ thường. :(
Vibhor Dube

Mát mẻ. Lưu ý rằng các định dạng đòi hỏi <pre>và sẽ không làm việc với ví dụ <p>, <span>vv
Jeppe

21

Tôi sẽ tạo một đường ống tùy chỉnh cho việc này:

@Pipe({
  name: 'prettyprint'
})
export class PrettyPrintPipe implements PipeTransform {
  transform(val) {
    return JSON.stringify(val, null, 2)
      .replace(' ', '&nbsp;')
      .replace('\n', '<br/>');
  }
}

và sử dụng nó theo cách này:

@Component({
  selector: 'my-app',
  template: `
    <div [innerHTML]="obj | prettyprint"></div>
  `,
  pipes: [ PrettyPrintPipe ]
})
export class AppComponent {
  obj = {
    test: 'testttt',
    name: 'nameeee'
  }
}

Xem stackblitz này: https://stackblitz.com/edit/angular-prettyprint


Đã làm việc! Tôi có một chuỗi json, không phải một đối tượng json, vì vậy tôi chỉ cần thêm dòng này trước khi gọi JSON.stringify: var jsonObject = JSON.parse (jsonString);
Derek

Cú pháp không mong muốn, tôi mong đợi việc sử dụng giống như sử dụng một đường ống tiêu chuẩn: <div>{{obj | prettyprint }}</div> nhưng nó đã hoạt động!
Paul Gorbas

1
Như @ shane-hsu đã chỉ ra, có một jsonđường ống tích hợp, giống như có trong Angular 1.
David Souther

Bạn thiếu implements PipeTransformsauexport class PrettyPrintPipe
MatthiasSommer

1
Tại sao đây không phải là anser được chấp nhận? Nó trả lời cho câu hỏi hỏi, không giống như các câu trả lời được chấp nhận
davejoem

4

Vì đây là kết quả đầu tiên trên google, hãy để tôi thêm một bản tóm tắt nhanh:

  • nếu bạn chỉ cần in JSON mà không cần định dạng thích hợp, jsonđường ống tích hợp do Shane Hsu đề xuất hoạt động hoàn hảo:<pre>{{data | json}}</pre>

  • tuy nhiên, nếu bạn muốn có một đầu ra khác, bạn sẽ cần tạo đường ống của riêng mình như Thierry Templier đã đề xuất:

    1. ng g generate pipe prettyjson
    2. trong prettyjson.pipe.ts:
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'prettyjson'
})
export class PrettyjsonPipe implements PipeTransform {

  transform(value: any, ...args: any[]): any {
    return JSON.stringify(value, null, 2)
    .replace(/ /g, '&nbsp;') // note the usage of `/ /g` instead of `' '` in order to replace all occurences
    .replace(/\n/g, '<br/>'); // same here
  }

}
  1. Cuối cùng, và vì chúng tôi trả về nội dung HTML, nên đường ống phải được sử dụng bên trong một innerHTMLhàm:
<div [innerHTML]="data | prettyjson"></div>

0

vì biến của tôi được liên kết hai chiều với ngModel, tôi không thể thực hiện nó trên html. Tôi đã sử dụng ở phía thành phần JSON.stringify(displayValue, null, 2) và nó đã thực hiện công việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.