私はちょっと怪しいです。私は、JSON文字列を構築しようとしている、私のプログラムでトレースバックを生成している。本当に奇妙なことは、私が切り取ってコンソールに貼り付けると、すべてが機能するということです。Python dict/list mixはJSONシリアライズ可能ではありません
まず、コードを示します。
def readgs2JSON(self, msg):
d = {"Channel" : "Readings"}
d["Sensor"] = msg.ReadingsChn.ReadingReport.attrib["Sensor"]
d["ReadingID"] = msg.ReadingsChn.ReadingReport.attrib["ReadingID"]
d["Detect"] = msg.ReadingsChn.ReadingReport.Data.attrib["Detect"]
d["Level"] = msg.ReadingsChn.ReadingReport.Data.attrib["Level"]
d["Units"] = msg.ReadingsChn.ReadingReport.Data.attrib["Units"]
if "Id" in msg.ReadingsChn.ReadingReport.Data.attrib:
d["Id"] = msg.ReadingsChn.ReadingReport.Data.attrib["Id"]
d["SUD"] = [el.attrib for el in msg.ReadingsChn.ReadingReport.Data.iterchildren()]
print d
return d
変数msgは、lxmlによって生成されるオブジェクト化された要素です。あなたがそれを印刷するとき、コードによって生成された辞書は、このように見えます。 (申し訳ありませんが、それは読みにくいですうまくラップを整列したいとは思われない。。)
{'Detect': 'NONE', 'Level': '0', 'SUD': [{'Type': 'int', 'Name':'Reading1', 'Value': '75856'}, {'Type': 'int', 'Name': 'Reading2', 'Value': '75857'}, {'Type': 'int', 'Name': 'Reading3', 'Value': '75858'}, {'Type': 'int', 'Name': 'Reading4', 'Value': '75859'}, {'Type': 'int', 'Name': 'ClockTicks', 'Value': '389'}, {'Type': 'array', 'Name': 'Spectrum', 'Value': 'None'}], 'Units': 'bars', 'ReadingID': 'R000009233', 'Sensor': 'SC001', 'Channel': 'Readings'}
だから、私は私のプログラム内json.dumps(D)を実行すると、私はトレースバックを得る:
を[Failure instance: Traceback: <type 'exceptions.TypeError'>: {'Type': 'int', 'Name': 'Reading1', 'Value': '75856'} is not JSON serializable
/usr/lib64/python2.7/site-packages/twisted/internet/base.py:1195:run
/usr/lib64/python2.7/site-packages/twisted/internet/base.py:1204:mainLoop
/usr/lib64/python2.7/site-packages/twisted/internet
/base.py:825:runUntilCurrent
/usr/lib64/python2.7/site-packages/twisted/internet/task.py:239:__call__
--- <exception caught here> ---
/usr/lib64/python2.7/site-packages/twisted/internet
/defer.py:149:maybeDeferred
/home/max/workspace/canary/CCSIEventHandler.py:26:tick
/home/max/workspace/canary/CCSIEventHandler.py:99:event2Msg
/home/max/workspace/canary/sensorcache.py:715:writeToBuffer
/home/max/workspace/canary/CCSI2JSON.py:37:pushCCSIMessage
/usr/lib64/python2.7/json/__init__.py:244:dumps
/usr/lib64/python2.7/json/encoder.py:207:encode
/usr/lib64/python2.7/json/encoder.py:270:iterencode
/usr/lib64/python2.7/json/encoder.py:184:default
]
私の端末から印刷されたdictをコピーして、それをPythonコンソールにコピーすると、本当に奇妙なことです。私の人生のために
>>> json.dumps(d)
'{"SUD": [{"Type": "int", "Name": "Reading1", "Value": "75856"}, {"Type": "int", "Name": "Reading2", "Value": "75857"}, {"Type": "int", "Name": "Reading3", "Value": "75858"}, {"Type": "int", "Name": "Reading4", "Value": "75859"}, {"Type": "int", "Name": "ClockTicks", "Value": "389"}, {"Type": "array", "Name": "Spectrum", "Value": "None"}], "Level": "0", "Detect": "NONE", "Units": "bars", "ReadingID": "R000009233", "Sensor": "SC001", "Channel": "Readings"}'
、私は違いを見つけることはできませんが、私はJSONの専門家です。誰にもこの問題がありましたか?
私はlxml.etree._Attribをシリアル化しようとしていました。私は辞書であると思っていました。辞書を作成して正しく動作するよう調整されたコードは次のとおりです。 msg.ReadingsChn.ReadingReport.Data
の
def readgs2JSON(self, msg):
d = {"Channel" : "Readings"}
d["Sensor"] = msg.ReadingsChn.ReadingReport.attrib["Sensor"]
d["ReadingID"] = msg.ReadingsChn.ReadingReport.attrib["ReadingID"]
d["Detect"] = msg.ReadingsChn.ReadingReport.Data.attrib["Detect"]
d["Level"] = msg.ReadingsChn.ReadingReport.Data.attrib["Level"]
d["Units"] = msg.ReadingsChn.ReadingReport.Data.attrib["Units"]
if "Id" in msg.ReadingsChn.ReadingReport.Data.attrib:
d["Id"] = msg.ReadingsChn.ReadingReport.Data.attrib["Id"]
sud_list = []
for el in msg.ReadingsChn.ReadingReport.Data.iterchildren():
sud_dict = {}
for item in el.attrib:
sud_dict[item] = el.attrib[item]
sud_list.append(sud_dict)
if sud_list is not []:
d["SUD"] = sud_list
return d
'msg.ReadingsChn.ReadingReport.Data'の子は特別な型のもので、JSONシリアライズ可能ではありません。そのタイプがコンソールに正しく表示される理由は、そのタイプが '__str__'または' __repr__'をオーバーライドしているからです。 –
'[SUD"] [0]) –