Go'da JSON Marshal ile küçük JSON anahtar adları


175

Kullanmak istiyorum "encoding/json"Paketi, başvurumun içe aktarılan paketlerinden birinde bildirilen bir yapıyı marshal istiyorum.

Örneğin.:

type T struct {
    Foo int
}

İçe aktarıldığından, yapıdaki tüm kullanılabilir (dışa aktarılan) alanlar büyük harfle başlar. Ama küçük harf anahtar isimlerine sahip olmak istiyorum:

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

sonuçlanacak

{ "Fan": 42}

ama almak istiyorum

{ "Fan": 42}

Sorunu kolay bir şekilde çözmek mümkün mü?


5
@Zippoxer: Şunu söyleyebilirim: bir istemci / sunucu iletişim protokolünde küçük harflerle kesin olarak tanımlanmış bir anahtar. Benim durumumda protokolü kendim tanımladığımdan beri önemli değil .. ama en azından teoride? Ama biliyorum ki bu sadece aptalca bir ayrıntıya çok fazla zaman harcamak.
ANisus

Özür dileme. Sen aptal değilsin, tam json spec'i kabul etmeyen dil aptalca (sorun aşağıdaki gibi kolayca çözülse de).
Jehan

@ANisus: Sorunuzu JSON anahtar adları değil, yapı anahtar adları ile ilgili olarak yanlış okudum. Oylamayı geri çekti.
Flimzy

Yanıtlar:


266

/ Json.Marshal kodlama belgelerine bir göz atın . Oluşturulan json'un nasıl biçimlendirileceğini belirlemek için yapı alanı etiketlerinin kullanılmasını tartışır.

Örneğin:

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

Bu JSON'u aşağıdaki gibi üretecektir:

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

8
Alan etiketleri? Oh my .. Dokümanlarda arama yaparken bu parçayı kaçırdım. Bayraklar, fonksiyonlar veya başka ayarlar arıyordum. Aradığım tam cevap bu! Buna ek olarak, öğrenmek için yeni bir Git konseptim var: alan etiketleri :)
ANisus

Oldukça kullanışlı. reflectPaket üzerinden çalışma zamanında bunlara erişebilirsiniz .
jimt

Evet, yansıma ile çalışırken bir alana meta veri eklemenin bir yolunun nasıl harika bir şey olabileceğini görüyorum! Btw, sadece cevabı denedim. Tıkır tıkır çalışıyor.
ANisus

5
Ben sadece go dilini lanetlemeye başladım - bu ne kadar aptalca, neden üretilen JSON vb. Hatta atladım ve kız arkadaşımı neden bu kadar heyecanlı olduğumu açıkladım: D Çok güzel :)))
nyxz

11
İki nokta üst üste ve etiketin ilk tırnak işareti arasında boşluk olmadığından emin olun! Yerine json:"some_tag"kullanın json: "some_tag". Bir süre bununla biraz ısırdım.
David Morales

8

Dışa aktarmak istediğiniz anahtarlarla kendi yapınızı oluşturabilir ve onlara küçük harf adları için uygun json etiketlerini verebilirsiniz. Ardından, JSON olarak kodlamadan önce istediğiniz yapıyı kendinize kopyalayabilirsiniz. Veya yerel bir yapı oluşturmakla uğraşmak istemiyorsanız, muhtemelen bunu yapabilir map[string]interface{}ve kodlayabilirsiniz.


Aptalca şey, diğer paketin (türleri içeren) aslında benim olması. Ancak, evet, muhtemelen bir yapı olması gerektiği gerçeğine körü körüne baktım. Kullanmak map[string]interface{}iç içe nesneler / yapılar ile sonuçlanmadığı sürece işe
yarar

1
@ ANISUS: Ah, cevabım, yapının tanımını kontrol etmemeniz üzerine kurulmuştu. jimt'ın cevabı kesinlikle istediğiniz şeydir.
Lily Ballard

Evet, bunun harici bir paket olup olmadığından emin değildim. Ancak cevabınız, tanımları kontrol etmediğiniz durumlarda hala alakalı ve yararlıdır.
ANisus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.