我有点困惑。我试图构建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生成的一个对象化元素。由代码生成的dictionary,d在打印时是这样的。(抱歉,这很难读懂。它似乎不想很好地换行。)
^{pr2}$所以,当我执行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这是一个字典,我认为它是一个字典,因为它像一个dict一样工作。这是一个调整后的代码,可以构建一个字典,并且可以正常工作。在
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__
或{相关问题 更多 >
编程相关推荐