ค่า JSON มีสตริงหลายบรรทัดได้หรือไม่


114

ฉันกำลังเขียนไฟล์ JSON ซึ่งโปรแกรม Java จะอ่านได้ ส่วนย่อยมีดังนี้ ...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}


17
ฉันคิดว่านี่เป็นข้อมูลเพิ่มเติมเกี่ยวกับความสามารถในการอ่านไฟล์ JSON ที่ทำให้เป็นอนุกรมและไม่เกี่ยวกับการแบ่งบรรทัดในข้อมูลที่โหลด (ดังนั้นจึงไม่ใช่สตริง Multiline ที่ซ้ำกันใน JSON ) คิดว่ามันเหมือนกับการใช้ JSON เป็นไฟล์คอนฟิกูเรชันที่คุณมีสตริงที่ยาวและเพื่อความสะดวกในการอ่านการพันสตริงอย่างแน่นหนาจะเป็นประโยชน์ในกรณีที่มีคนแก้ไขผ่านโปรแกรมแก้ไขข้อความ
zashu

2
@zashu: โปรแกรมแก้ไขข้อความส่วนใหญ่มีฟังก์ชันห่อหุ้ม สิ่งนี้มีประโยชน์มากกว่าความกว้างของบรรทัดแบบฮาร์ดโค้ดในทันที
Lightness Races ใน Orbit

4
@LightnessRacesinOrbit ที่เรียกใช้ git diffs (หรือแก้ไขข้อขัดแย้งในการผสาน) บนไฟล์ที่มีเส้นยาวเช่นนี้ก็เป็นความเจ็บปวดเช่นกัน
Hubert Kario

1
นี่เป็นการหลอกล่อสตริง Multiline ใน JSON โดยอ้างถึงคำถามของ OP: " เป็นไปได้ไหมที่จะมีสตริงหลายบรรทัดใน JSON ส่วนใหญ่เพื่อความสบายตาดังนั้นฉันคิดว่าฉันสามารถเปิดใช้การตัดคำในโปรแกรมแก้ไขของฉันได้ แต่ฉัน 'ฉันแค่อยากรู้อยากเห็น ... "
Andre Figueiredo

คำตอบ:


61

ตรวจสอบสเปค ! การผลิตถ่านของไวยากรณ์ JSON สามารถรับค่าต่อไปนี้:

  • อักขระ Unicode ใด ๆ ยกเว้น"- หรือหรือ\หรือควบคุมอักขระ
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u สี่ฐานสิบหก

บรรทัดใหม่คือ "อักขระควบคุม" ดังนั้นไม่คุณอาจไม่มีบรรทัดใหม่ที่แท้จริงภายในสตริงของคุณ แต่คุณอาจเข้ารหัสโดยใช้การรวมกันของสิ่งที่\nและ\rที่คุณต้องการ

JSONLintยืนยันเครื่องมือที่ JSON ของคุณไม่ถูกต้อง


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


32

ฉันไม่แน่ใจในความต้องการที่แน่นอนของคุณ แต่วิธีหนึ่งที่เป็นไปได้ในการปรับปรุง 'ความสามารถในการอ่าน' คือการจัดเก็บเป็นอาร์เรย์

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

เข้าร่วมอีกครั้งเมื่อใดก็ตามที่จำเป็นกับ

result.join(" ")

13
แม้ว่าจะไม่เหมาะ มันเป็นการรั่วไหลของนามธรรม ฉันจะพิจารณารูปแบบข้อมูลที่ระบุในลักษณะนี้โดยพื้นฐานแล้วเสีย
Lightness Races ใน Orbit

4
ฉันนึกไม่ออกว่าการออกแบบเอกสาร API หรือ JSON ด้วยวิธีนี้เพียงเพื่อเพิ่มความสามารถในการอ่านสตริง (สำหรับเหตุผลในการดีบักที่ฉันเดาเท่านั้น): | ....
Adam Dyga

"ฉันจะพิจารณารูปแบบข้อมูลที่ระบุในลักษณะนี้โดยพื้นฐานแล้วเสีย" พิจารณาว่านี่เป็นกรณีทดสอบแม้ว่า หากคุณต้องการฮาร์ดโค้ดสตริงคุณอาจต้องการไฟล์คุณสมบัติ โดยส่วนตัวฉันจะไม่จัดเก็บข้อมูล "จริง" ใน JSON ในสถานการณ์ปกติ แต่ถ้านี่เป็นวิธีง่ายๆในการเปลี่ยนจากไม่มีการทดสอบไปสู่การทดสอบให้ทำเลย
sf_jeff

@AdamDyga ในความเป็นจริงมันอาจมีประโยชน์ในการจัดเก็บไฟล์ json ลงใน CVS โดยที่หน่วยของเดลต้าคือบรรทัด
yota

7

ไม่ใช่ทางออกที่ดี แต่คุณสามารถลองใช้เครื่องมือhjson ลิงค์ . ช่วยให้คุณสามารถเขียนข้อความหลายบรรทัดในโปรแกรมแก้ไขแล้วแปลงเป็นรูปแบบ JSON ที่ถูกต้อง หมายเหตุ:เพิ่มอักขระ "\ n" สำหรับบรรทัดใหม่ แต่คุณสามารถลบออกในโปรแกรมแก้ไขข้อความใดก็ได้โดยใช้ฟังก์ชัน "แทนที่ทั้งหมด .. "

ปล. น่าจะคอมเม้นถาม แต่ไม่มี repo พอขอโทษด้วย


นั่นเป็นความคิดที่ดีจริงๆ เวอร์ชันควบคุม Hjson และเปลี่ยนเป็น JSON ตามต้องการ
Lightness Races ใน Orbit

3

ตามที่ฉันเข้าใจคำถามไม่ได้เกี่ยวกับวิธีการส่งสตริงที่มีสัญลักษณ์ควบคุมโดยใช้jsonแต่วิธีการจัดเก็บและกู้คืน json ในไฟล์ซึ่งคุณสามารถแยกสตริงที่มีสัญลักษณ์ควบคุมตัวแก้ไขได้

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

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


2

ฉันเชื่อว่ามันขึ้นอยู่กับตัวแปล json ที่คุณใช้ ... ในจาวาสคริปต์ธรรมดาคุณสามารถใช้ตัวยุติบรรทัดได้

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}

นี่คือที่ถูกต้อง แต่ช่องว่างที่จะออกเยื้อง: =>a\ c a c
Andre Figueiredo

1
JavaScript ไม่มี "ตัวแปล JSON" ที่ยอมรับสิ่งนี้ สามารถใช้ JSON ในสตริงเท่านั้น จริงอยู่ถ้าคุณระบุ JSON ไว้ในสตริงลิเทอรัลคุณสามารถใช้แนวทางนี้ได้ แต่นั่นเป็นสิ่งผิดปกติที่ต้องทำ คุณสับสน JSON กับการประกาศออบเจ็กต์จริงใน JavaScript หรือไม่?
Lightness Races ใน Orbit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.