乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      json在python下的解析

       java_laq小館 2013-12-24
      json在python下的解析

      http:///

      這個(gè)事json的官方網(wǎng)站,上面有很多json工具的介紹,和json的原理性介紹。


      dos下面simplejson的安裝,先配置系統(tǒng)變量里面的path至C:/python27/,然后進(jìn)入simplejson的目錄,輸入python.exe setup.py install這個(gè)命令,執(zhí)行安裝程序即可。


      一、JSON的格式:

      1,對(duì)象:

      {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."}

      屬性 :  , 屬性 :  , 屬性 :  },必須是大括號(hào)未外表,如果不是大括號(hào),則把大括號(hào)外邊的內(nèi)容過(guò)濾掉。

       

      2,數(shù)組是有順序的值的集合。一個(gè)數(shù)組開(kāi)始于"[",結(jié)束于"]",值之間用","分隔。

      [

      {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."},

      {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www."}

      ]

      3, 值可以是字符串、數(shù)字、truefalse、null,也可以是對(duì)象或數(shù)組。這些結(jié)構(gòu)都能嵌套。

       

      4,json示例:

      import json

      # Converting Python to JSON

      json_object = json.write( python_object )

      # Converting JSON to Python

      python_object = json.read( json_object )

       

      5,simplejson 示例:

      import simplejson

      # Converting Python to JSON

      json_object = simplejson.dumps( python_object )

      # Converting JSON to Python

      python_object = simplejson.loads( json_object )

       

      二、pythonweb接口上查詢(xún)信息

      1,先看個(gè)例子

      >>> import urllib

      >>> url='http://a./page/api/saInterface/searchServerInfo.htm?serviceTag=729HH2X'

      >>> page=urllib.urlopen(url)

      >>> data=page.read()

      >>> print data           //這個(gè)就是json的數(shù)據(jù)結(jié)構(gòu),str類(lèi)型

      {"total":1,"data":[{"outGuaranteeTime":"","assetsNum":"B50070100007003","cabinet":"H05","deviceModel":"PowerEdge 1950","hostname":"hzshterm1.alibaba.com","logicSite":"中文站","memoryInfo":{"amount":4,"size":8192},"ip":"172.16.20.163","isOnline":true,"useState":"使用中","serviceTag":"729HH2X","cpuInfo":{"amount":2,"masterFrequency":1995,"model":"Intel(R) Xeon(R) CPU           E5405  @ 2.00GHz","coreNum":8,"l2CacheSize":6144},"cabinetPositionNum":"","buyTime":"2009-06-29","manageIp":"172.31.58.223","idc":"杭州德勝機(jī)房","responsibilityPerson":"張之誠(chéng)"}],"errorMsg":"","isSuccess":true}

      >>> type(data)

      <type 'str'>

       

      2,有了json數(shù)據(jù)結(jié)構(gòu),我卻不知道怎么把它解析出來(lái),幸虧有了李建輝的指導(dǎo)。大概思路是:

      首先,json基本上是key/value的,python中就叫字典。既然是字典,那就應(yīng)該安照讀字典的方式去讀。

      將上面的data轉(zhuǎn)為字典類(lèi)型,這里用json模塊的read方法。

       

      >>> import json

      >>> ddata=json.read(data)

      >>> ddata

      {'isSuccess': True, 'errorMsg': '', 'total': 1, 'data': [{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU           E5405  @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]}

      >>> 

      看看ddata已經(jīng)是dict類(lèi)型了

      >>> type(ddata)

      <type 'dict'>

       

      其次,我們以讀字典中key ”data”對(duì)應(yīng)的鍵值

      >>> ddata['data']    //查看字典的方法!

      [{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU           E5405  @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]

       

      >>>type(ddata[‘data’])

      <type 'list'>

       

      發(fā)現(xiàn)ddata[‘data’]是一個(gè)列表,列表就要用序號(hào)來(lái)查詢(xún)

      >>> ddata['data'][0]         //查看列表的方法!

      {'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU           E5405  @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}

      >>> 

       

      呵呵,ddata[‘data’]列表的0號(hào)元素是個(gè)字典。。

      好,那我們查查keyidc的鍵值是多少

      >>> ddata['data'][0]['idc']          //查看字典的方法!

      '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf'

      >>> print ddata['data'][0]['idc']   //呵呵,為什么print搞出來(lái)的是漢字呢?

      杭州德勝機(jī)房

       

      看到這里終于明白怎么解析json數(shù)據(jù)結(jié)構(gòu)了。。。

      那就是一層一層往下剝



      json是很方便的web數(shù)據(jù)格式,特別是用在ajax的數(shù)據(jù)處理上。許多Python的框架都是使用 simplejson 包來(lái)進(jìn)行處理。不過(guò)最近發(fā)現(xiàn)我有這樣的一個(gè)需求,比如我想把一個(gè)Python的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為javascript數(shù)據(jù)結(jié)構(gòu),也就是將python的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為json格式,然后用在模板中使用。如,我有一個(gè)模板,其中有javascript代碼: 

      <html> 
      <head> 
      <title>Title</title> 
      <script type="text/javascript"> 
      s = {{=data}} 
      </script> 
      </head> 
      <body></body> 
      </html> 

      上面的data我可以這樣處理: 

      def index(): 
          data = {'name':'limodou'}; 
          return dict(data=simplejson.dumps(data)) 

      這樣,通過(guò)simplejson.dumps可以將一個(gè)python的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為json格式,結(jié)果為: 

      {"name": "limodou"} 

      那么,它可以正確處理基本的數(shù)據(jù)類(lèi)型。使用它,要求你傳入的數(shù)據(jù)應(yīng)該是基本的。但是這里可能有問(wèn)題: 

      如何處理非基本類(lèi)型數(shù)據(jù)。比如從數(shù)據(jù)庫(kù)中讀出的日期,一般都是datetime類(lèi)型,它不是基本類(lèi)型,直接傳入simplejson會(huì)報(bào)錯(cuò) 
      如果我不希望是"limodou",而是limodou能不能呢?為什么會(huì)有這個(gè)需求,因?yàn)樵谖疑傻膉s代碼中,有些可能是函數(shù)名,或執(zhí)行語(yǔ)句,因此不是字符串,不希望自動(dòng)加引號(hào) 
      對(duì)于第一個(gè)問(wèn)題,simplejson的主頁(yè)和代碼中都有例子,方法就是從JSONEncoder中派生子類(lèi),然后覆蓋default方法,對(duì)于特殊的類(lèi)型進(jìn)行處理就可以了。 

      對(duì)于第二個(gè),simplejson好象沒(méi)有什么支持,于是我做了擴(kuò)展: 

      import simplejson as sj 

      class ComplexEncoder(sj.JSONEncoder): 
          def __init__(self, classes=[], **kwargs): 
              sj.JSONEncoder.__init__(self, **kwargs) 
              if not isinstance(classes, (tuple, list)): 
                  self.classes = [classes] 
              else: 
                  self.classes = list(classes) 
              
          def _iterencode_default(self, o, markers=None): 
              for _cls in self.classes: 
                  if isinstance(o, _cls): 
                      return o() 
              newobj = self.default(o) 
              return self._iterencode(newobj, markers) 
          
      class R: 
          def __init__(self, obj): 
              self.obj = obj 
              
          def __call__(self): 
              return self.obj 

      def dumps(obj, classes=R): 
          return sj.dumps(obj, cls=ComplexEncoder, classes=classes) 

      我定義了一個(gè)自已的Encoder類(lèi),然后覆蓋了__init__()方法和_iterencode_default()方法。這樣允許對(duì)特殊類(lèi)調(diào)用類(lèi)的轉(zhuǎn)換方法,這樣ComplexEncoder就不會(huì)對(duì)特殊類(lèi)進(jìn)行特殊處理了,其結(jié)果為特殊類(lèi)的輸出。舉例: 

      >>> print dumps({'a':'dddddd', 'b':R('sssssss')}) 
      {"a": "dddddd", "b": sssssss} 

      可以看出sssssss前后就沒(méi)有雙引號(hào)了。 
      《轉(zhuǎn)載嘿~》

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多