2016-09-07 20 views
5

Büyük miktarda json ayrıştırdım, bazı değerleri manipüle ettim ve tekrar yazmak istiyorum. Aeson sayıları bilimsel olarak çözer, ancak bunu kodladığında, bilimsel olarak birçok durumda bilimsel gösterimde sayıları gösterir ve aeson bunu değiştirmek için görebileceğim herhangi bir araç sunmaz.aeson'da, bilimsel göstergeye neden olmadan bir Değerden nasıl kodlarsınız?

> decode "[\"asdf\", 1, 1.0, 1000000000.1, 0.01]" :: Maybe Value 
Just (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2]) 

encode (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2]) 
"[\"asdf\",1,1,1.0000000001e9,1.0e-2]" 

> encode (Array [String "asdf", Number 1, Number 1.0, Number 1000000000.1, Number 0.01]) 
"[\"asdf\",1,1,1.0000000001e9,1.0e-2]" 

Değerlerimi, diğer dillerin kullanabileceği daha yaygın olarak kabul edilebilir bir biçimde sayılarla nasıl yazabilirim? Hassas kayıp veya tamsayı taşmalarıyla ilgilenmediğimi varsayalım. Bilimsel paket, sayıları bu şekilde biçimlendirmek için araçlara sahiptir, aeson sadece onu kullanmamaya başladı.

>formatScientific Fixed Nothing (0.01) 
"0.01" 

>formatScientific Fixed Nothing (1000000000.1) 
"1000000000.1" 
+3

Diğer diller bunu tüketemezse, JSON çözümleyicileriyle ilgili bir sorun. [Bilimsel gösterim JSON standardının bir parçasıdır.] (Http://www.json.org/) – Cirdec

+1

Not. Kendi kodlama işlevimi yazmadan bunu yapmanın bir yolu olup olmadığını bilmek isterim. –

cevap

4

pretty printer for Aeson (sadece sürümü oldukça yakın 0.8 beri) ne istediğini tam olarak yapan bir yapılandırma seçeneği vardır:

Prelude> :m +Data.Aeson Data.Aeson.Encode.Pretty 
Prelude Data.Aeson Data.Aeson.Encode.Pretty> encodePretty' (defConfig{confNumFormat=Decimal}) (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2]) 
"[\n \"asdf\",\n 1.0,\n 1.0,\n 1000000000.1,\n 0.01\n]" 

Maalesef bu güzel-yazıcı yerine artık 1.0 olarak gerçek ayrılmaz rakamları verir Bilimsel notasyonda (gerçekten her yerde tamamıyla olması gereken) baskı basımından daha ciddi bir sorun olduğunu düşündüğüm 1 sayılı belgenin. encode yapar, normal aeson gibi

Prelude Data.Aeson Data.Aeson.Encode.Pretty> encodePretty (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2]) 
"[\n \"asdf\",\n 1.0,\n 1.0,\n 1.0000000001e9,\n 1.0e-2\n]" 

Sürüm fraksiyonel parçası olmadan 0.7.2 hala baskılı tamsayılar,:

aeson-pretty-0.7.2:Data.Aeson.Encode.Pretty> encodePretty (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2]) 
"[\n \"asdf\",\n 1,\n 1,\n 1.0000000001e9,\n 1.0e-2\n]" 

ben bir hata olarak bu dosyayı edeceğiz düşünüyorum Bu aynı zamanda varsayılan ayarı ile olur rapor.

Ayrıca, sayıların nasıl görüneceği konusunda tam denetim sağlayan bir CustomNumberFormat seçeneğinin de bulunduğunu unutmayın.

+0

Kütüphaneden en az bir miktar kod çıkartabilmem gerekir. Hiç kimse daha iyi bir yöntem vermezse, bunu cevaplayacağını işaret ederim. –

1

Bu işlevin kendimden önce baktım; O zaman bir Ruby programıyla arayüz oluşturmaya çalıştığımı ve standart Ruby JSON ayrıştırıcısının bilimsel gösterimi desteklemediğine inanıyorum. Ne yazık ki, aeson'un bunu yapmanın bir yolu olmadığını düşünüyorum, bu yüzden ya aeson ya da kendi kodlayıcınızı yazmanız gerekecektir.

Diğer ayrıntılar on the aeson issue tracker'dir. Bu sorun, buna ek olarak Value'dan farklı bir şekilde toEncoding kullanılmasını önerir, ancak bunun sizin durumunuzda pratik olup olmadığı açık değildir.