2011年9月9日 星期五

[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 還是跑不過去…

沒有留言:

張貼留言