【问题标题】:Convert python dictionary to JavaScript object literal将 python 字典转换为 JavaScript 对象字面量
【发布时间】:2014-01-19 17:26:03
【问题描述】:

使用 json.dumps 我可以将字典转换为 json 格式,如下所示:

>>> from json import dumps
>>> dumps({'height': 100, 'title': 'some great title'})
'{"title": "some great title", "height": 100}'

但是,我希望将我的字典变成 javascript 文字,如下所示:

{title: "some great title", height: 100}

(请注意标题和高度周围没有双引号。)

是否有 Python 库可以执行此操作?

【问题讨论】:

  • 您打算如何将数据从 Python 传输到 JavaScript?
  • thefourtheye:在 HTML 模板中,我将从 Python 创建的对象文字分配给 JavaScript 变量。也许有一种方法可以使用 JavaScript 从 json.dumps 的输出中生成对象文字?
  • 您可以在 JavaScript 模板部分使用 JSON.parse 将此字符串转换为有效的 JavaScript 对象字面量。
  • 谢谢。现在这应该足够了,尽管我仍然很好奇我是否可以直接从 Python 生成对象字面量。
  • 或者像这样:print("{" + ", ".join("%s: %r" % (k, d[k]) for k in d) + "}")(但使用 JSON 进行两种语言之间的传输更简洁)

标签: python json


【解决方案1】:

肮脏的黑客,但可以工作:子类 JSONEncoder 并覆盖 _iterencode_dict 方法,以便它产生您想要的格式的密钥。在 python3.3 中,它位于 json.encoder 模块的第 367 行中,在产量 _encoder(key) 中。您可能想要复制整个方法并将这一行更改为 yield key if isinstance(key, str) else _encoder(key) 之类的内容。

再一次 - 这真的很脏,除非你别无选择 - 不要那样做。虽然,它是可行的,但如果你真的需要它,有什么值得知道的。

【讨论】:

    【解决方案2】:

    如果您知道您的所有密钥都是有效令牌,则可以使用以下简单代码:

    import json
    
    def js_list(encoder, data):
        pairs = []
        for v in data:
            pairs.append(js_val(encoder, v))
        return "[" + ", ".join(pairs) + "]"
    
    def js_dict(encoder, data):
        pairs = []
        for k, v in data.iteritems():
            pairs.append(k + ": " + js_val(encoder, v))
        return "{" + ", ".join(pairs) + "}"
    
    def js_val(encoder, data):
        if isinstance(data, dict):
            val = js_dict(encoder, data)
        elif isinstance(data, list):
            val = js_list(encoder, data)
        else:
            val = encoder.encode(data)
        return val
    
    encoder = json.JSONEncoder(ensure_ascii=False)
    js_val(encoder, {'height': 100, 'title': 'some great title'})
    

    js_val() 的返回值是你想要的格式。

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 2011-11-26
      • 2019-07-21
      • 2022-10-02
      • 2011-03-16
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多