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