我有一个问题,我想知道如何有效地解决。
我有JSON格式的数据(与转储/加载一起使用)并包含unicode。
这是使用JSON实现发送消息的协议的一部分。因此消息将作为字符串发送,然后加载到python词典中。这意味着表示,作为python字典,之后将看起来像:
{u" mykey":你" myVal"}
系统处理这样的结构本身没有问题,但是当我要进行数据库查询来存储这个结构时就会发生这种情况。
我使用pyOrient对OrientDB。该命令最终结果如下:
"CREATE VERTEX TestVertex SET data = {u'mykey': u'myVal'}"
最终将在数据字段中获取OrientDB中的以下值:
{'_NOT_PARSED_': '_NOT_PARSED_'}
我假设当您希望进行查询或以某种方式表示包含unicode的数据对象时,此问题与其他情况有关。
如何有效地获取任意深度的数据表示,以便能够在查询中使用它?
为了澄清更多,这是db期望的字符串:
"CREATE VERTEX TestVertex SET data = {'mykey': 'myVal'}"
如果我只是陈述错误的问题/问题而应该以其他方式处理,我非常愿意接受建议。但我想要实现的是有一种有效的方法来使用 python2.7 来构建指向任意数据结构的orientdb(使用pyorient)的db-query。正在设置的data属性是OrientDB类型EMBEDDEDMAP。
非常感谢任何帮助。
EDIT1:
更明确地说明第一个代码块在转储/加载json之后将对象显示为dict以避免混淆。
答案 0 :(得分:0)
Dargolith:
根据您的上一个响应,您似乎只是在寻找能够控制unicode和其他数据类型打印方式的转码python表达式的代码。这是一个提供此控件的非常简单的功能。有一些方法可以使这个函数更有效(例如,通过使用字符串缓冲区而不是执行此处发生的所有递归字符串连接)。这仍然是一个非常简单的功能,并且它的执行可能仍然由您的数据库查找主导。
正如您在每个'if'语句中所看到的,您可以完全控制每种数据类型的打印方式。
def expr_to_str(thing):
if hasattr(thing, 'keys'):
pairs = ['%s:%s' % (expr_to_str(k),expr_to_str(v)) for k,v in thing.iteritems()]
return '{%s}' % ', '.join(pairs)
if hasattr(thing, '__setslice__'):
parts = [expr_to_str(ele) for ele in thing]
return '[%s]' % (', '.join(parts),)
if isinstance(thing, basestring):
return "'%s'" % (str(thing),)
return str(thing)
print "dumped: %s" % expr_to_str({'one': 33, 'two': [u'unicode', 'just a str', 44.44, {'hash': 'here'}]})
输出:
dumped: {'two':['unicode', 'just a str', 44.44, {'hash':'here'}], 'one':33}
答案 1 :(得分:0)
我继续使用json.dumps()作为评论中建议的sobolevn。我起初并没有想到那个,因为我在驱动程序中并没有真正使用json。然而事实证明,json.dumps()提供了我所使用的所有数据类型所需的格式。一些例子:
>>> json.dumps('test')
'"test"'
>>> json.dumps(['test1', 'test2'])
'["test1", "test2"]'
>>> json.dumps([u'test1', u'test2'])
'["test1", "test2"]'
>>> json.dumps({u'key1': u'val1', u'key2': [u'val21', 'val22', 1]})
'{"key2": ["val21", "val22", 1], "key1": "val1"}'
如果您需要更多地控制有关此转换的格式,引号或其他内容,请参阅Dan Oblinger的回复。