2014-09-27 45 views
1

處理Google的半JSON API,將所有內容都返回爲字符串 - 即使是數字元素。如何在Python中編碼JSON時更改數據項

// [ 
    { 
    "id": "22144" 
    ,"t" : "AAPL" 
    ,"e" : "NASDAQ" 
    ,"l" : "100.75" 
    ,"l_fix" : "100.75" 
    ,"l_cur" : "100.75" 
    ,"s": "0" 
    ,"ltt":"4:00PM EDT" 
    ,"lt" : "Sep 26, 4:00PM EDT" 
    ,"lt_dts" : "2014-09-26T16:00:01Z" 
    ,"c" : "+2.88" 
    ,"c_fix" : "2.88" 
    ,"cp" : "2.94" 
    ,"cp_fix" : "2.94" 
    ,"ccol" : "chg" 
    ,"pcls_fix" : "97.87" 
    } 
    ] 

當編碼該響應與dict:

uquotes = json.loads(status.text[3:]) 

print uquotes 

我得到傳入的JSON結構的所有元素爲字符串:

[{u'c': u'+2.88', u'ccol': u'chg', u'e': u'NASDAQ', u'ltt': u'4:00PM EDT', u'cp_fix': u'2.94', u'c_fix': u'2.88', u'l': u'100.75', u's': u'0', u'lt': u'Sep 26, 4:00PM EDT', u'pcls_fix': u'97.87', u't': u'AAPL', u'lt_dts': u'2014-09-26T16:00:01Z', u'l_fix': u'100.75', u'cp': u'2.94', u'id': u'22144', u'l_cur': u'100.75'}] 

兩部分,以這樣的問題:

  1. 我如何enco de數字值,而不是類似的字符串:

    try: 
        d[t.tag] = int(text) 
    except ValueError: 
        try: 
         d[t.tag] = float(text) 
        except ValueError: 
         d[t.tag] = text 
    

    嘗試整數,返回到浮點數,默認爲文本作爲最後的手段。

  2. 如何將所有密鑰變爲(ascii)?

回答

1

你的方法趕上ValueError看起來不錯,但你也可以使一切都浮動;在那裏沒有大數字不適合浮點精度。

請注意,谷歌最有可能使用字符串,因爲這些都是貨幣值,並且float()類型可能沒有意義,除非需要對其中的大部分進行算術運算。

不要緊,你的字符串是unicode值,但可以隨時對其進行編碼,以明確ASCII:

try: 
    d[t.tag] = float(text) 
except ValueError: 
    d[t.tag] = text.encode('ASCII') 

Python會隱式編碼爲ASCII當你與str值混合unicode,你可以可交換使用任何鍵的str版本。

如果你想堅持仍然支持整數,用str.isdigit()測試字符串;它會只對代表值的整數爲真:

try: 
    d[t.tag] = int(text) if text.isdigit() else float(text) 
except ValueError: 
    d[t.tag] = text.encode('ASCII') 

你可以在一個函數封裝這個,然後使用該功能在字典解析組合列表理解:

def convert(v): 
    try: 
     return int(v) if v.isdigit() else float(v) 
    except ValueError: 
     return v.encode('ASCII') 

uquotes = [{k: convert(v) for k, v in d.items()} for d in json.loads(status.text[3:])] 
+0

應該更用我的問題清楚。我在哪裏迭代字典進行類型轉換。嘗試 - 除了部分去哪裏?看着loads()對象處理程序,但找不到一種方法來完成這項工作。謝謝! – fxstein 2014-09-27 15:01:10

+0

非常好!非常感謝你! – fxstein 2014-09-27 15:17:49