簡體   English   中英

使用'json.loads()'對類型為字符串的整數進行類型轉換

[英]Typecast an integer formatted as a string with 'json.loads()'

我有一個來自Web服務器的JSON響應,該響應將整數包裝在引號中,從而在將其裝入Python的json模塊時有效地將其轉換為字符串。

有沒有一種聰明的方法來強制轉換所有整數並在json.loads()之后自動浮動?

示例數據:

{
   u'qualityIndicators':{  
      u'reviewIndicator':{  
         u'activeReviewCount':u'229',
         u'activePeriodInDays':u'365',
         u'reviewsCountedSince':u'2009-02-18',
         u'reviewIndicatorPeriodSummary':{  
            u'reviewIndicatorPeriods':{  
               u'reviewIndicatorPeriod':{  
                  u'reviewIndicatorMarkSummaries':{  
                     u'reviewIndicatorMarkSummary':[  
                        {  
                           u'markDescription':u'EXCELLENT',
                           u'periodMarkCount':u'142'
                        },
                        {  
                           u'markDescription':u'GOOD',
                           u'periodMarkCount':u'17'
                        },
                        {  
                           u'markDescription':u'FAIR',
                           u'periodMarkCount':u'12'
                        },
                        {  
                           u'markDescription':u'POOR',
                           u'periodMarkCount':u'22'
                        },
                        {  
                           u'markDescription':u'VERY_POOR',
                           u'periodMarkCount':u'36'
                        }
                     ]
                  },
                  u'startDate':u'2014-03-09',
                  u'activeReviewCount':u'229',
                  u'endDate':u'2015-03-09',
                  u'periodReviewCount':u'229',
                  u'overallMark':u'3.90',
                  u'reviewIndicatorCriteria':{  
                     u'reviewIndicatorCriterion':[  
                        {  
                           u'markDescription':u'GOOD',
                           u'periodCriterionCount':u'224',
                           u'criterionDescription':u'DELIVERY',
                           u'mark':u'4.04'
                        },
                        {  
                           u'markDescription':u'GOOD',
                           u'periodCriterionCount':u'219',
                           u'criterionDescription':u'GOODS',
                           u'mark':u'4.05'
                        },
                        {  
                           u'markDescription':u'GOOD',
                           u'periodCriterionCount':u'206',
                           u'criterionDescription':u'SERVICE',
                           u'mark':u'3.59'
                        }
                     ]
                  },
                  u'overallMarkDescription':u'GOOD'
               }
            }
         },
         u'totalReviewCount':u'1911',
         u'overallMark':u'3.90',
         u'overallMarkDescription':u'GOOD'
      }
   },
   u'targetMarketISO3':u'DEU',
   u'url':u'www.zalando.de',
   u'tsId':u'X1C77CF6EE730D2E88A284D7203D1B20F',
   u'languageISO2':u'de',
   u'name':u'zalando.de'
}

一種方法是

def decode(obj):
    for k,v in obj.iteritems():
        try:
           obj[k] = int(v)
        except:
           pass 
    return obj

from json import JSONDecoder
d = JSONDecoder(object_hook=decode)
d.decode(<json_string>)

您可以通過子類化json.JSONDecoder來實現自己的解碼器:

import json


def try_casting_to(value, type_):
    try:
        value = type_(value)
    except ValueError:
        pass
    return value

def try_float(value):
    return try_casting_to(value, float)

def try_int(value):
    return try_casting_to(value, int)


class NumberDecoder(json.JSONDecoder):

    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.parse_number)

    def parse_number(self, dct):
        for key, value in dct.items():
            if isinstance(value, basestring):
                if '.' in value:
                    value = try_float(value)
                else:
                    value = try_int(value)
            dct[key] = value
        return dct


data = """
{"foo": {"baz": {"foo": {"baz": "qux", "bar": "10"}, "bar": "42.5"}}}
"""

obj = NumberDecoder().decode(data)
print obj

輸出:

{u'foo': {u'baz': {u'foo': {u'bar': 10, u'baz': u'qux'}, u'bar': 42.5}}}

這僅處理中帶引號的整數,而不是鍵中的整數(盡管很容易更改)。

# get raw_data
import json
data = json.loads(raw_data)

def conv_num(data):
    if isinstance(data, str):
        try:
            return json.loads(data)
        except ValueError:
            return data
    elif isinstance(data, list):
        ret = []
        for v in data:
            ret.append(conv_num(v))
        return ret
    elif isinstance(data, dict):
        ret = {}
        for k, v in data.items():
            ret[k] = conv_num(v)
        return ret
    else:
        return data

data = conv_num(data)

這會將所有整數或浮點形狀的字符串轉換為相應的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM