【问题标题】:python: turn nested dict into JSON-like formatpython:将嵌套字典转换为类似 JSON 的格式
【发布时间】:2016-12-18 14:34:27
【问题描述】:

我有一个嵌套字典,格式为:

dict = {
"BLOCK_NAME": {
    "SUB_BLOCK_NAME1": {
        "ENTRY_NUMBER1": {
            "FIELD_NAME" : "VALUE"
            "FIELD_NAME2" : "VALUE2"
            "FIELD_NAME3" : "VALUE3"
        }
    }
}

}

我想使用 jquery 树表插件 (w2ui) 在 HTML 页面中显示它。该插件从以下格式的数据初始化:

{ recid: 1, key_1: 'John', key_2: 'doe', w2ui: { children: [] }},
        { recid: 2, key_1: 'Stuart', key_2: 'Motzart', 
            w2ui: {
                children: [
                    { recid: 21, key_1: 'Stuart', key_2: 'Motzart',w2ui: { children: [] } },
                    { recid: 22, key_1: 'Jin', key_2: 'Franson',
                        w2ui: {
                            children: [

等等…… 我正在使用 Jinja2 作为模板引擎,我正在考虑完成这项任务的最佳方式。

我能想到的选项是:

  • 编写一个 python 函数,将 dict 转换为与插件格式匹配的长字符串,并将其传递给 Jinja。

  • 将所有逻辑放在模板中,同时我对其进行迭代并创建 JS 格式。

  • 将 dict 保存为 JSON 并在 JS 中处理(不太可取,我的 JS 很弱)

你怎么看?

编辑: 在@mpf82 回答之后,我尝试了以下方法:

HTML:

<script type="text/javascript">
$(function () {
    $('#grid').w2grid({ 
        name: 'grid', 
        url  : 'get_json',
        show: { 
            toolbar: true,
        },
        multiSearch: false,
        searches: [
            { field: 'lname', caption: 'Last Name', type: 'text' },
            { field: 'fname', caption: 'First Name', type: 'text' },
            { field: 'email', caption: 'Email', type: 'text' },
            { field: 'sdate', caption: 'Start Date', type: 'date' }
        ],
        columns: [                
            { field: 'lname', caption: 'Last Name', size: '30%' },
            { field: 'fname', caption: 'First Name', size: '30%' },
            { field: 'email', caption: 'Email', size: '40%' },
            { field: 'sdate', caption: 'Start Date', size: '90px' }
        ]

    });
    w2utils.settings['dataType'] = 'JSON'  
});
</script>

樱桃:

    @cherrypy.expose
    @cherrypy.tools.json_in()
    @cherrypy.tools.json_out()
    def get_json(self):
        try:
        # optionally get the w2ui request
            requested_data = cherrypy.request.json
        except:
            pass
        # build your w2ui data dict
        my_data = { recid: 1, fname: 'John', lname: 'doe', email: 'jdoe@gmail.com', sdate: '4/3/2012', w2ui: { children: [] }}
        # return dict, no further conversion neccessary
        return my_data

我从 Cherrypy 收到错误 415:不支持的媒体类型 需要内容类型为 application/json、text/javascript 的实体

【问题讨论】:

    标签: jquery python jinja2 w2ui


    【解决方案1】:

    无需通过 jinja 传递数据或创建长字符串。

    相反,使用 w2ui 网格的 url 属性,将 w2utils 设置为使用 JSON (w2utils.settings.dataType = 'JSON';),如果您使用的是cherrypy,您需要做的就是在您的 URL 上使用 JSON 装饰器:

    @cherrypy.expose
    @cherrypy.tools.json_in()
    @cherrypy.tools.json_out()
    def my_url():
        try:
            # optionally get the w2ui request
            requested_data = cherrypy.request.json
        except:
            pass
        # build your w2ui data dict
        my_data = { recid: 1, key_1: 'John', key_2: 'doe', w2ui: { children: [] }}
        # return dict, no further conversion neccessary
        return my_data
    

    【讨论】:

    • 设置 w2utils 数据类型应该是您做的第一件事。您还可以在浏览器的网络选项卡中检查请求,以查看您发送和接收的请求数据和请求标头。
    • 搞定了。我必须在我的 dict 响应中添加更多状态字段,谢谢。
    【解决方案2】:

    您可以简单地将您的 dict 转储为类似 JSON 的字符串:

    import json
    
    # You may need some converting: dict = convert_to_jq_format(dict) 
    result = json.dumps(dict)
    

    并将结果传递给 Jinja 的模板。

    当然,如果你的dict不匹配插件的格式,你应该先转换它。

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2015-08-25
      • 2019-06-18
      • 2023-03-11
      相关资源
      最近更新 更多