2016-09-07 5 views
5

많은 양의 json을 파싱하고 일부 값을 조작했으며이를 다시 작성하고 싶습니다. Aeson은 숫자를 과학적으로 디코딩하지만, 기본적으로 인코딩 할 때 과학적 표기법으로 숫자가 표시되는 경우가 많으며 aeson에서는이를 변경할 수있는 방법을 제공하지 않습니다.aeson에서 과학 표기법을 사용하지 않고 어떻게 값을 인코딩합니까?

> 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]" 

다른 언어가 사용할 수있는보다 광범위한 형식의 숫자로 내 값을 쓸 수있는 방법은 무엇입니까? 정밀도 손실이나 정수 오버 플로우에 관심이 없다고 가정 해 봅시다. 과학적인 패키지에는 이런 방식으로 숫자의 서식을 지정하는 수단이 있습니다.

>formatScientific Fixed Nothing (0.01) 
"0.01" 

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

다른 언어에서는 사용할 수 없으면 JSON 파서에 문제가 있습니다. [과학적 표기법은 JSON 표준의 일부입니다.] (http://www.json.org/) – Cirdec

+1

Noted. 나는 여전히 내 자신의 encode 함수를 작성하지 않고 그것을 할 수있는 방법이 있는지 알고 싶다. –

답변

4

pretty printer for Aeson (전용 버전, 아주 최근 0.8 이후) 당신이 요구하는지 정확히 수행하는 구성 옵션이 있습니다

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]" 

불행하게도,이 꽤 - 프린터가 지금 대신 1.0으로 실제 통합 번호를 출력을 1인데, 과학 표기법으로 소수점을 인쇄하는 것보다 훨씬 심각한 문제가 있다고 생각합니다. encode가하는 정상 아이손처럼

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]" 

버전 소수 부분이없는 0.7.2 여전히 인쇄 정수 :

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]" 

을 나는 버그로 파일 것 같아요 이것은 또한 기본 설정으로 발생 보고서.

숫자가 표시되는 방식을 완벽하게 제어 할 수있는 CustomNumberFormat 옵션이 있습니다.

+0

적어도 라이브러리에서 최소한의 코드를 추출 할 수 있어야합니다. 아무도 더 나은 방법을 제시하지 않으면 나는 대답 할 것입니다. –

1

본인은이 기능을 직접 사용해 보았습니다. 나는 Ruby 프로그램과 인터페이스를 시도하고 있었고 표준 Ruby JSON 파서는 과학 표기법을 지원하지 않았다고 믿습니다. 불행히도 나는 aeson이 그것을 할 수있는 방법이 없다고 믿습니다. 그러므로 aeson을 패치하거나 자신의 엔코더를 작성해야합니다.

자세한 내용은 on the aeson issue tracker입니다. 이 문제는 추가로 Value 이외의 유형에 toEncoding을 사용하는 것이 좋습니다. 그러나이 방법이 실제로 사용 가능한지 여부는 분명하지 않습니다.