我正在尝试将部分Python 2.6代码升级到Python
2.7。这段代码使用该json
模块生成一些JavaScript(不兼容JSON),然后将其插入脚本的其余部分。
一般的想法是能够插入代码或引用在其他地方定义的变量:它不打算用作JSON数据,而是JavaScript代码。
这是可在Python 2.6中使用的自定义编码器:
import json
class RawJavaScriptText:
def __init__(self, jstext):
self._jstext = jstext
def get_jstext(self):
return self._jstext
class RawJsJSONEncoder(json.JSONEncoder):
def _iterencode_default(self, o, markers=None):
if isinstance(o, RawJavaScriptText):
yield self.default(o)
else:
json.JSONEncoder._iterencode_default(self, o, markers)
def default(self, o):
if isinstance(o, RawJavaScriptText):
return o.get_jstext()
else:
return json.JSONEncoder.default(self, o)
testvar = {
'a': 1,
'b': 'abc',
# RawJavaScriptText will be inserted as such, no serialisation.
'c': RawJavaScriptText('function() { return "Hello World"; }'),
'd': RawJavaScriptText('some_variable_name')
}
print json.dumps(testvar, cls=RawJsJSONEncoder)
使用Python 2.6,我们得到所需的结果:
{ "a": 1, "c": function() { return "Hello World"; },
"b": "abc", "d": some_variable_name }
使用Python 2.7,所有内容都变成一个字符串,从而失去了JavaScript代码的有效性:
{ "a": 1, "c": "function() { return \"Hello World\"; }",
"b": "abc", "d": "some_variable_name" }
(请注意,这仅是与一组预定义的原始JavaScript值一起使用,以防止可能的注入或滥用。)
当然,这样做的原因是的_iterencode_default
方法JSONEncoder
在json
模块的Python
2.7版本中不存在。诚然,它并不是要一开始就被覆盖。
在Python 2.7中还有另一种方法可以实现此目标吗?使用JSON库的基础能够以这种方式生成JavaScript代码非常方便。
编辑: 这是完整的工作解决方案,使用James
Henstridge建议的替换。我正在为替换令牌使用随机UUID,这应避免任何冲突。这样,这是可以同时使用python 2.6和2.7的直接替换。
import json
import uuid
class RawJavaScriptText:
def __init__(self, jstext):
self._jstext = jstext
def get_jstext(self):
return self._jstext
class RawJsJSONEncoder(json.JSONEncoder):
def __init__(self, *args, **kwargs):
json.JSONEncoder.__init__(self, *args, **kwargs)
self._replacement_map = {}
def default(self, o):
if isinstance(o, RawJavaScriptText):
key = uuid.uuid4().hex
self._replacement_map[key] = o.get_jstext()
return key
else:
return json.JSONEncoder.default(self, o)
def encode(self, o):
result = json.JSONEncoder.encode(self, o)
for k, v in self._replacement_map.iteritems():
result = result.replace('"%s"' % (k,), v)
return result
testvar = {
'a': 1,
'b': 'abc',
'c': RawJavaScriptText('function() { return "Hello World"; }'),
'd': [ RawJavaScriptText('some_variable_name') ],
'e': {
'x': RawJavaScriptText('some_variable_name'),
'y': 'y'
}
}
print json.dumps(testvar, cls=RawJsJSONEncoder)
结果(2.6和2.7):
{"a": 1, "c": function() { return "Hello World"; },
"b": "abc",
"e": {"y": "y", "x": some_variable_name},
"d": [some_variable_name]}
当扩展了在幕后使用的C扩展范围以涵盖更多编码过程时,您正在使用的未记录私有接口似乎消失了。
一种替代方法是为您的RawJavaScriptText
值插入占位符字符串,并对输出进行后期处理,dumps
以将这些占位符转换为所需的表单。
例如:
>>> data = {'foo': '@@x@@'}
>>> print json.dumps(data)
{"foo": "@@x@@"}
>>> print json.dumps(data).replace('"@@x@@"', 'some_variable_name')
{"foo": some_variable_name}
如果您的JSON包含不受信任的数据,那么您将需要小心这种技术:您不希望局外人意外地将此类占位符添加到输出中。
问题内容: 我有一些要发送到我的应用程序中的芹菜任务的对象。这些对象显然无法使用默认json库进行json序列化。有没有一种方法可以使celery使用自定义JSON / 对这些对象进行序列化/反序列化? 问题答案: 这里有些晚,但是您应该能够通过在kombu序列化程序注册表中注册自定义编码器和解码器,如docs中所示: http [//docs.celeryproject.org/en/lates
本章介绍: Decoder Encoder 单元测试 本章讲述 Netty 中如何轻松实现定制的编解码器,由于 Netty 架构的灵活性,这些编解码器易于重用和测试。为了更容易实现,使用 Memcached 作为协议例子是因为它更方便我们实现。 Memcached 是来自 Memcached.org 的免费开源、高性能、分布式的内存对象缓存系统,其目的是加速动态 Web 应用程序的响应,减轻数据库
问题内容: 我正在开发一个自定义WordPress插件,在其中,我在主插件页面上有一些HTML表单,在后页上有一些PHP的函数,如从数据库中获取信息等。为详细解释,这里是代码。 。 主插件文件: 这是 my_functions.php 文件。 但是我的代码无法正常工作,甚至无法命中my_functions.php文件。这里有什么问题?仅需要基本步骤即可在此模式下工作。 问题答案: 最后,在获得 T
本文向大家介绍javascript自定义滚动条实现代码,包括了javascript自定义滚动条实现代码的使用技巧和注意事项,需要的朋友参考一下 在工作中经常会遇到内容会超出固定的一个范围,超出的内容一般会使用到滚动条来滚动显示。 但是用浏览器默认的滚动条经常被产品经理鄙视,可是用css却改变不了滚动条的样式,还好,有万能的js ^_^~~ 网上有各种各样的插件,但最顺手的还是自己写的,还可以一边撸
有没有办法在Intellij中创建自定义的代码格式顺序?更具体地说,当一起按Option+Command+L时,我试图更改默认格式,并按类型格式化导入。
是否可以在Visual Studio代码中自定义代码折叠的工作方式? 我使用一种通用模式来定义各种不同文档类型之间的代码区域。 > 所以,对于XML,我用和包装文本部分 对于typescript/JavaScript,我使用和。 在完整的Visual Studio(不是VS代码)中,我有一个自定义扩展,它可以窥探文档类型之间的模式,并基于该模式创建折叠,从而允许我创建整洁的自定义文档大纲。我希望在