ตัวพิมพ์เล็กชื่อคีย์ JSON ด้วย JSON Marshal in Go


175

ฉันต้องการใช้"encoding/json"แพคเกจเพื่อจัดโครงสร้างการประกาศในหนึ่งในแพ็กเกจที่นำเข้าของแอปพลิเคชันของฉัน

เช่น.:

type T struct {
    Foo int
}

เนื่องจากมีการนำเข้าฟิลด์ที่มีอยู่ทั้งหมด (ส่งออก) ในโครงสร้างเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่ แต่ฉันต้องการมีชื่อคีย์ตัวพิมพ์เล็ก:

out, err := json.Marshal(&T{Foo: 42})

จะส่งผลให้

{ "ฟู": 42}

แต่ฉันต้องการที่จะได้รับ

{ "foo": 42}

เป็นไปได้ไหมที่จะแก้ไขปัญหาด้วยวิธีง่าย ๆ ?


5
@ Zippoxer: ฉันจะบอกว่า: คีย์ในโปรโตคอลการสื่อสารลูกค้า / เซิร์ฟเวอร์ที่กำหนดไว้อย่างเคร่งครัดเพื่อตัวอักษรตัวพิมพ์เล็ก ในกรณีของฉันมันไม่สำคัญเพราะฉันได้กำหนดโปรโตคอลด้วยตัวเอง .. แต่ในทางทฤษฎีแล้วอย่างน้อย? แต่ฉันรู้ว่าส่วนใหญ่เป็นเพียงฉันใช้เวลามากเกินไปในรายละเอียดเล็กน้อยโง่
ANisus

อย่าขอโทษ คุณไม่ใช่คนที่โง่เง่าภาษาที่ไม่ยอมรับรายละเอียดแบบเต็มของ json คือคนที่โง่ (แม้ว่าปัญหาจะได้รับการแก้ไขอย่างง่ายดายดังด้านล่าง)
Jehan

@ANisus: ฉันอ่านคำถามของคุณผิดเกี่ยวกับชื่อคีย์ struct ไม่ใช่ชื่อคีย์ JSON ถอนการโหวต
Flimzy

คำตอบ:


266

มีลักษณะที่เอกสารสำหรับการเข้ารหัส / json.Marshal มันกล่าวถึงการใช้แท็กฟิลด์ struct เพื่อกำหนดวิธีการจัดรูปแบบ json สร้างขึ้น

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

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

สิ่งนี้จะสร้าง JSON ดังต่อไปนี้:

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
แท็กฟิลด์ โอ้ว .. ฉันคิดถึงส่วนนี้ทั้งหมดเมื่อค้นหาในเอกสาร ฉันกำลังมองหาธงฟังก์ชั่นหรือการตั้งค่าอื่น ๆ นี่คือคำตอบที่ฉันต้องการ! และนอกจากนี้ฉันมีแนวคิด Go ใหม่เพื่อเรียนรู้เกี่ยวกับ: field tags :)
ANISUS

มันค่อนข้างมีประโยชน์ คุณสามารถเข้าถึงได้ที่ runtime ผ่านreflectแพ็คเกจ
jimt

ใช่เมื่อทำงานกับการไตร่ตรองฉันเห็นว่าการมีวิธีเพิ่มข้อมูลเมตาลงในเขตข้อมูลอาจเป็นสิ่งที่ยอดเยี่ยม! Btw เพิ่งลองคำตอบ ทำงานเหมือนจับใจ
ANISUS

5
ฉันเพิ่งเริ่มสาปแช่งภาษาโก - นี่มันโง่ขนาดไหนทำไมพวกเขาถึงสร้างฟิลด์ด้วยตัวอักษรตัวเล็กใน JSON ที่สร้างขึ้น ฯลฯ จากนั้นฉันก็เจอกระทู้นี้และคิดว่า "OMG นั่นยอดเยี่ยม !!!" ฉันยังเพิ่มขึ้นและอธิบายแฟนของฉันทำไมฉันตื่นเต้น: D มันเจ๋ง :)))
nyxz

11
ตรวจสอบให้แน่ใจว่าไม่มีช่องว่างระหว่างเครื่องหมายโคลอนและเครื่องหมายคำพูดแรกของแท็ก! ใช้แทนjson:"some_tag" json: "some_tag"ฉันได้รับโดยบิตนี้ในขณะที่
David Morales

8

คุณสามารถสร้างโครงสร้างของคุณเองด้วยปุ่มที่คุณต้องการส่งออกและให้แท็ก json ที่เหมาะสมสำหรับชื่อตัวพิมพ์เล็ก จากนั้นคุณสามารถคัดลอกโครงสร้างที่ต้องการลงในของคุณก่อนที่จะเข้ารหัสมันเป็น JSON หรือถ้าคุณไม่ต้องการรบกวนการสร้างโครงสร้างในท้องถิ่นคุณอาจสร้างmap[string]interface{}และเข้ารหัสได้


สิ่งที่โง่ก็คือแพคเกจอื่น ๆ (ที่มีประเภท) เป็นของฉันเช่นกัน แต่ใช่ฉันอาจจ้องไปที่สุ่มสี่สุ่มห้าในความจริงที่ว่ามันต้องมีโครงสร้าง การใช้ a map[string]interface{}จะทำงานได้ตราบใดที่ฉันไม่ได้จบลงด้วยวัตถุ / โครงสร้างซ้อนกัน
ANISUS

1
@ANisus: โอ้คำตอบของฉันเป็นสิ่งที่คุณไม่ได้ควบคุมนิยามของโครงสร้าง คำตอบของ jimt นั้นเป็นสิ่งที่คุณต้องการอย่างแน่นอน
Lily Ballard

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