Elixir’den JSON’a Dönüştürücü
Bir Elixir struct veya map yapıştır. Karşılığında JSON al.
Bu araç ne yapıyor
Elinde bir Elixir struct’ı varsa ve minik bir dönüşüm için Jason veya Poison’ı projeye sokmak istemiyorsan, buraya yapıştır, JSON’ı al. Tek bir %Order{} literal’i, map, keyword list, iç içe struct zinciri, hatta farklı biçimlerdeki map’lerden oluşan bir liste bile sorun değil.
Çıktı, struct’ın @derive Jason.Encoder’a sahip olduğunda Jason.encode!/1’in vereceği sonuçla aynı. __struct__ alanı atılır, atom anahtarları JSON string anahtarlarına döner ve iç içe struct’lar iç içe JSON nesnelerine açılır. Listeler JSON dizilerine, nil null’a, true/false aynen, integer’lar integer, float’lar float olarak kalır.
Keyword list’ler ([key: value, other: 1]) JSON nesneleri olarak çıkar — Elixir’in klasik konvansiyonu. Binary string’ler ve charlist’lerin ikisi de JSON string’ine dönüşür. DateTime, Date, NaiveDateTime ve Time, RFC 3339’a göre ISO-8601 string’i olarak çıkar. Tuple’lar JSON dizilerine dönüşür (Jason’ın custom encoder ile kullandığı fallback’in aynısı).
Nasıl kullanılır
Üç adım. Tek satırlık bir map için de, struct’larla dolu bir Phoenix context modülü için de aynı şekilde çalışır.
Elixir’ini yapıştır (ya da örneği dene)
Kodunu soldaki editöre bırak. Bir struct literal, bir map, bir keyword list, bir iç içe struct ya da örnekli bir defstruct — hepsi geçerli.
%ModuleName{} söz dizimini, pipe’ları ve defstruct tanımlarını olduğu gibi bırakabilirsin. Parser bunları anlıyor.
Dönüştür’e bas
Yeşil Dönüştür butonuna tıkla. Araç struct’ı gezer, __struct__’u atar, iç içe struct’ları açar ve tek seferde JSON’ı üretir.
JSON’ı kopyala
Sağ panelden girintili JSON’ı al. Phoenix API testine, ExUnit fixture’ına veya GraphQL endpoint’i için paylaşılan bir schema’ya rahatça yapıştırabilirsin.
Gerçekten işe yaradığı durumlar
Phoenix API fixture’ları
Bir context schema’n var ve controller testi için JSON fixture istiyorsun. Struct’ı yapıştır, JSON’ı kaydet, tamam — IEx’te derleyip encode etmeye gerek yok.
GraphQL response biçimi
Bir <a href="https://hexdocs.pm/absinthe/" target="_blank" rel="noopener">Absinthe</a> resolver’ı yazıyorsun ve resolver fonksiyonunu bağlamadan önce belirli bir struct’ın ne tür bir JSON üreteceğini görmek istiyorsun.
Ecto schema’larını belgelemek
Bir Ecto schema struct’ı aslında bir JSON kontratıdır. Bir kere JSON’a çevir, API dokümanı olarak commit’le, schema değiştiğinde senkron tut.
Diller arası veri aktarımı
Elixir servisin verileri Python ML pipeline’ına teslim ediyor. Örnek bir struct yapıştır, alt taraftaki ekibin tüketeceği JSON’ı önceden gör.
Sık sorulanlar
Jason.encode!/1 ile birebir eşleşiyor mu?
Hedef tam olarak bu. Struct’lar __struct__’unu kaybeder, atom anahtarlar string anahtara döner, iç içe struct’lar iç içe nesnelere açılır. Ağaçtaki her struct’a @derive Jason.Encoder koyduğunda alacağın çıktının aynısı.
Atom’lar nasıl ele alınıyor?
Map’in atom anahtarları JSON string anahtarlarına dönüşür. Atom değerleri, atom adını içeren JSON string’lerine dönüşür (örn. :active, "active" olur) — Jason ile aynı davranış.
Peki tuple’lar?
Tuple’lar JSON dizilerine dönüşür ({1, 2, 3} → [1, 2, 3]). Teknik olarak Jason, tuple’lar için custom encoder ister; bu araç veriyi kaybetmemen için sağduyulu varsayılanı seçer.
Keyword list ile map arasında fark var mı?
İkisi de JSON nesnesi olarak çıkar. [name: "Ava", id: 1] keyword list’i ile %{name: "Ava", id: 1} map’i birebir aynı JSON’ı üretir. Keyword list’te aynı anahtar birkaç kez geçiyorsa ilk geçtiği yer korunur.
DateTime ve Decimal nasıl ele alınıyor?
DateTime/Date/NaiveDateTime/Time ISO-8601 string’ine dönüşür. Decimal değerleri JSON sayı olarak çıkar (ya da sayısal string güvenliğini tercih edersen string olarak — biçime göre değişir). Jason’da uygun encoder’ları derive ettiğinde alacağının aynısı.
Kodum saklanıyor mu?
Kodun dönüşüm için backend’e gönderilir ve saklanmaz — payload’ı loglamıyoruz. Yapıştırmadan önce gerçek kullanıcı verilerini ve gizli bilgileri değiştirmeyi unutma.
İşine yarayabilecek diğer araçlar
Elixir to JSON, araç kutusunun geri kalanıyla güzel uyuşuyor: