SORU
19 EYLÜL 2009, CUMARTESİ


Standart biçim json modülü ile yüzer

Standart python 2.6 json module yüzer listesi seri hale getirmek için kullanıyorum. Ancak, bu gibi sonuçlar alıyorum:

>>> import json
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'

Yalnızca iki ondalık basamak ile format için yüzer istiyorum. Çıkış bu gibi görünmelidir:

>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'

Kendi JSON Kodlayıcı benim sınıf tanımlama denedim:

class MyEncoder(json.JSONEncoder):
    def encode(self, obj):
        if isinstance(obj, float):
            return format(obj, '.2f')
        return json.JSONEncoder.encode(self, obj)

Bu tek yüzen bir nesne için çalışır:

>>> json.dumps(23.67, cls=MyEncoder)
'23.67'

Ama başarısız iç içe nesneler:

>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'

Dış bağımlılıkları istemiyorum, standart json modülü ile sopa tercih ederim.

Bunu nasıl başarabilir?

CEVAP
19 EYLÜL 2009, CUMARTESİ


Ne yazık ki, maymun-yama, kanaatimce; json standart kütüphane paketinde bir tasarım kusuru gösterir) ile bunu yapmak için var. E. g., bu kod:

import json
from json import encoder
encoder.FLOAT_REPR = lambda o: format(o, '.2f')

print json.dumps(23.67)
print json.dumps([23.67, 23.97, 23.87])

yayan:

23.67
[23.67, 23.97, 23.87]

sizin arzu ettiğiniz gibi. Belli ki, orada olmalı bir şekilde tasarlandı geçersiz FLOAT_REPR böylece HER temsil bir şamandıra altında kontrol istiyorsanız, bunun için; ama ne yazık ki bu böyle değil json paket tasarlanmıştır:-(.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • footiecyclo

    footiecyclo

    26 EYLÜL 2009
  • tseyina

    tseyina

    2 AĞUSTOS 2006