เอาต์พุตสตริง JSON รูปแบบ AngularJS


92

ฉันมีแอปพลิเคชัน AngularJS ซึ่งรวบรวมข้อมูลจากอินพุตแปลงโมเดลเป็นสตริงโดยใช้JSON.stringify()และให้ผู้ใช้แก้ไขโมเดลนี้ในลักษณะที่ฟิลด์อินพุตจะได้รับการอัปเดตหาก<textarea>องค์ประกอบได้รับการอัปเดตและในทางกลับกัน การผูกสองทางบางประเภท :)

ปัญหาคือ String นั้นดูน่าเกลียดและฉันต้องการจัดรูปแบบให้มีลักษณะดังนี้:

ป้อนคำอธิบายภาพที่นี่

และไม่เหมือนตอนนี้:

ป้อนคำอธิบายภาพที่นี่

ความคิดใด ๆ ที่สามารถทำได้? หากคุณต้องการข้อมูลเพิ่มเติมโปรดอย่าลังเลที่จะถาม ทุกคำตอบขอชื่นชมและตอบทันที

ขอขอบคุณ.

ป.ล. ฉันเดาว่านี่น่าจะเป็นคำสั่งหรือฟิลเตอร์ที่กำหนดเอง ข้อมูลเองไม่ควรเปลี่ยนแปลงเฉพาะเอาต์พุตเท่านั้น


1
ลองทำดูได้ไหม - ใน textarea ให้กด enter แล้วจัดรูปแบบสตริงผลลัพธ์ตามต้องการ จากนั้นใน$watch(ตามคำตอบของคำถามก่อนหน้านี้) ในโมเดล textarea คุณสามารถทำconsole.log()และดูว่าค่าใดที่คุณได้รับในสตริงสำหรับคีย์ Enter - ฉันคิดว่ามันคือ "/ n"
callmekatootie

1
จากสิ่งนี้ฉันสามารถแนะนำวิธีจัดรูปแบบข้อความได้
callmekatootie

{"anchorPosition": "1", "ความยาก": "1", "includeInSequence": "1", "questionCount": "1"}
amenoire

โดยพื้นฐานแล้วไม่มีอะไรเปลี่ยนแปลงหลังจากสร้าง String แล้ว
amenoire

ดูคำตอบด้านล่าง - ช่วยได้ไหม
callmekatootie

คำตอบ:


66

คุณสามารถใช้พารามิเตอร์ทางเลือกของ JSON.stringify()

JSON.stringify(value[, replacer [, space]])

พารามิเตอร์

  • valueค่าที่จะแปลงเป็นสตริง JSON
  • แทนที่ถ้าฟังก์ชันแปลงค่าและคุณสมบัติที่พบในขณะที่สตริง; ถ้าอาร์เรย์ระบุชุดคุณสมบัติที่รวมอยู่ในอ็อบเจ็กต์ในสตริงสุดท้าย คำอธิบายโดยละเอียดของฟังก์ชันตัวแทนที่มีอยู่ในบทความแนะนำจาวาสคริปต์การใช้ JSON ดั้งเดิม
  • ช่องว่าง ทำให้สตริงผลลัพธ์ถูกพิมพ์ออกมาสวย

ตัวอย่างเช่น:

JSON.stringify({a:1,b:2,c:{d:3, e:4}},null,"    ")

จะให้ผลลัพธ์ดังต่อไปนี้:

"{
    "a": 1,
    "b": 2,
    "c": {
        "d": 3,
        "e": 4
    }
}"

5
โปรดทราบว่าสิ่งนี้จะรักษาการ$$hashKeyใช้เชิงมุมของคุณสมบัติสำหรับการติดตามโมเดลภายใน
PixnBits

1
คุณยังทำได้JSON.stringify(object, null, 2)โดยที่ 2 คือจำนวนอักขระช่องว่าง
MrE

@ Lukasz ฉันสามารถหลีกเลี่ยง $$ Hashkey ได้หรือไม่?
Md Aslam

434

Angular มีในตัวfilterสำหรับแสดงJSON

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

สังเกตการใช้pre-tag เพื่อสงวนช่องว่างและเส้นแบ่ง

การสาธิต:

angular.module('app', [])
  .controller('Ctrl', ['$scope',
    function($scope) {

      $scope.data = {
        a: 1,
        b: 2,
        c: {
          d: "3"
        },
      };

    }
  ]);
<!DOCTYPE html>
<html ng-app="app">

  <head>
    <script data-require="angular.js@1.2.15" data-semver="1.2.15" src="//code.angularjs.org/1.2.15/angular.js"></script>
  </head>

  <body ng-controller="Ctrl">
    <pre>{{data | json}}</pre>
  </body>

</html>

นอกจากนี้ยังมีangular.toJsonวิธีการ แต่ฉันไม่ได้เล่นกับสิ่งนั้น ( เอกสาร )


1
ใช่ฉันรู้เรื่องนี้แล้ว แต่ฉันไม่สามารถสร้างตัวกรองนี้ได้เนื่องจาก textarea นั้นเป็นแบบจำลอง
amenoire

ง่ายมาก แต่มีประโยชน์มาก: D
Jamie Street

2
@ ra170 กรุณาอ่านคำถามทั้งหมดอย่างละเอียดไม่ใช่แค่หัวข้อ ฉันขอสิ่งที่แตกต่างจากตัวกรอง json ธรรมดาเล็กน้อย
amenoire

โปรดทราบว่าคุณ<pre>แท็กไม่ควรมีwhite-spaceการตั้งค่าคุณสมบัติการหรือnormal no-wrapมิฉะนั้น JSON ของคุณจะไม่ถูกเยื้องตามที่คุณต้องการ
falconepl

3
ฉันประสบปัญหา แต่ฉันทำโดยไม่ <ก่อน> .... ฉันเห็นคำตอบนี้และฉันแก้ไข .... ขอบคุณ !!
ลูคัส

23

หากคุณต้องการแสดง JSON เป็น HTML และสามารถยุบ / เปิดได้คุณสามารถใช้คำสั่งนี้ที่ฉันเพิ่งสร้างขึ้นเพื่อแสดงผลได้อย่างสวยงาม:

https://github.com/mohsen1/json-formatter/

ป้อนคำอธิบายภาพที่นี่


11

นอกจากตัวกรองเชิงมุมที่jsonกล่าวไปแล้วยังมีฟังก์ชันเชิงมุมtoJson()อีกด้วย

angular.toJson(obj, pretty);

พารามิเตอร์ตัวที่สองของฟังก์ชันนี้ช่วยให้คุณสามารถเปิดการพิมพ์สวย ๆ และกำหนดจำนวนช่องว่างที่จะใช้

หากตั้งค่าเป็นจริงเอาต์พุต JSON จะมีบรรทัดใหม่และช่องว่าง หากตั้งค่าเป็นจำนวนเต็มเอาต์พุต JSON จะมีช่องว่างจำนวนมากต่อการเยื้อง

(ค่าเริ่มต้น: 2)


เพจของฉันถูกบล็อกเมื่อฉันให้อาร์เรย์ของวัตถุ 1,000 ชิ้น
Asqan

Youvariable = angular.toJson .... อย่างที่คุณเขียนดูเหมือนว่าผลลัพธ์จะออกมาสวย
Márcio Rossato

6

ฉันเดาว่าคุณต้องการใช้เพื่อแก้ไขข้อความ json จากนั้นคุณสามารถใช้วิธีของ ivarni:

{{ข้อมูล | json}}
และเพิ่มแอตทริบิวต์ adition เพื่อสร้าง
 แก้ไขได้

<pre contenteditable="true">{{data | json}}</pre>

หวังว่านี่จะช่วยคุณได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.