顯示具有 jython 標籤的文章。 顯示所有文章
顯示具有 jython 標籤的文章。 顯示所有文章

2011年9月9日 星期五

[jython]json到哪兒去了?(2)

經過了一段掙扎,回頭再看一下jyson的文件。
http://opensource.xhaus.com/projects/jyson/wiki/JysonUserObjects
這裡面提到,要輸出自己的 class 就要實作 __json__() 這個 method。

回頭再測試一下,jyson 的 loads 及 dumps 根本不看 object_hook 及 cls 的參數。
那麼,
a = json.loads(b,object_hook=ext.as_orderdict)
這個 a 只是一個 dict,所以,要自己再產生物件,於是乎從檔案讀回來就要改成

f = open(json_filename,'r')
  b = f.read()
  f.close()
  a = json.loads(b,object_hook=ext.as_orderdict)
  if sys.version.find('Java')>-1:
    c = ext.OrderDict()
    c.list = a['list']
    c.dict = a['dict']
    a = c
  return a

還有,物件  的定義裡要加上 __json__(self) 的方法。

def __json__(self): # for jyson
    return u"""{'list':%s,'dict':%s}""" % (json.dumps(self.list),json.dumps(self.dict))

文件中,說明一定要回傳 unicode 的字串。

呼,終於搞定了。

[jython]json到哪兒去了?

看著 python 2.6.5 可以快樂的使用 json,
jython 卻還不行使用。
網路上有 jyson,雖然他的用法已經很接近 python 的,
但是,就是不一樣,就是會遇到:

class OrderDictEncoder(json.JSONEncoder)

JSONEncoder 不在 jyson,所以沒辦法照用。

唉~~~,事情不會這麼美好。

以下就開始改變程式,讓 python 及 jython 都能用。

(1)
import sys
if sys.version.find('Java')>-1:
  import com.xhaus.jyson.JysonCodec as json
else:
  import json

(2) 這一段我超喜歡的,條件式的宣告在 python 及 jython 裡,就跟寫程式沒兩樣。讚!
if sys.version.find('Java')>-1:
  import com.xhaus.jyson
  class OrderDictEncoder(com.xhaus.jyson.JysonEncoder):
    def default(self, obj):
      if isinstance(obj, OrderDict):
        return {'list':obj.list,'dict':obj.dict}
      return com.xhaus.jyson.JysonEncoder.default(self, obj)
else:
  class OrderDictEncoder(json.JSONEncoder):
    def default(self, obj):
      if isinstance(obj, OrderDict):
        return {'list':obj.list,'dict':obj.dict}
      return json.JSONEncoder.default(self, obj)

(3) 因為 jyson 不支援 load 及 dump,只有 loads 及 dumps,所以全改成 loads 及 dumps。
例如:
f = open(json_filename,'r')
a = json.load(f,object_hook=ext.as_orderdict)
改成:
f = open(json_filename,'r')
b = f.read()
a = json.loads(b,object_hook=ext.as_orderdict)

但是…天不從人願…
    b = json.dumps(result,cls=ext.OrderDictEncoder)
        at com.xhaus.jyson.JysonEncoder.append_json_repr(Unknown Source)
        at com.xhaus.jyson.JysonEncoder.json_repr(Unknown Source)
        at com.xhaus.jyson.JysonCodec.dumps(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.ClassCastException: java.lang.ClassCastException: org.python.core.PyCl
ass cannot be cast to org.python.core.PyType

這個我就不知道該怎麼辦才好啦…
jython 還是跑不過去…

[python][jython]關於Exception的不同

在 python 裡以下的敘述可用

except Exception as ex:

但是,在 jython 卻會出問題:

except Exception as ex:
SyntaxError: mismatched input 'as' expecting COLON

耶~~~~

http://jythonpodcast.hostjava.net/jythonbook/en/1.0/ExceptionHandlingDebug.html

經過查詢上列網頁,jython 2.5.2 還不支援這種寫法。

那就只好先寫舊寫法。

except Exception , ex:

擋著先。