Python Json来自Ordered Dict

izkcnapc  于 4个月前  发布在  Python
关注(0)|答案(5)|浏览(56)

我尝试创建一个嵌套的JSON结构,如下所示:
示例Json:

{
        "id" : "de",
        "Key" : "1234567",
        "from" : "[email protected]",
        "expires" : "2018-04-25 18:45:48.3166159",
        "command" : "method.exec",
        "params" : {
          "method" : "cmd",
          "Key" : "default",
          "params" : {
            "command" : "testing 23"
          }
        }

字符串
我试图从一个OrderedDict中完成这一点。我不确定正确的方法来构建OrderedDict,以便生成正确的JSON。
Python代码:

json_payload = OrderedDict(
                            [('id', id),
                                ('Key', keystore),
                                ('from', '[email protected]'),
                                ('expires', expires),
                                ('command', 'method.exec')]

                              # What goes here for the params section??
                           )
print json.dumps(json_payload, indent=4, default=str)

yc0p9oo0

yc0p9oo01#

使用@haifzhan的输出作为输入,提供了所需的内容。

payload = OrderedDict(
      [
        ('id', 'de'), 
        ('Key', '1234567'), 
        ('from', '[email protected]'), 
        ('expires', '2018-04-25 18:45:48.3166159'), 
        ('command', 'method.exec'), 
        ('params', 
          OrderedDict(
            [
              ('method', 'cmd'), 
              ('Key', 'default'),
              ('params', 
                OrderedDict(
                  [
                   ('command', 'testing 23')
                  ]
                )
              )
            ]
          )
        )
      ]
    )
print json.dumps(json_payload, indent=4, default=str)

字符串

6tqwzwtp

6tqwzwtp2#

你在JSON数据的末尾漏掉了}

import json
import collections

data =  {
        "id" : "de",
        "Key" : "1234567",
        "from" : "[email protected]",
        "expires" : "2018-04-25 18:45:48.3166159",
        "command" : "method.exec",
        "params" : {
          "method" : "cmd",
          "Key" : "default",
          "params" : {
            "command" : "testing 23"
          }
        }}

data_str = json.dumps(data)
result = json.loads(data_str, object_pairs_hook=collections.OrderedDict)
print(result)

字符串
输出量:

OrderedDict(
  [
    ('id', 'de'), 
    ('Key', '1234567'), 
    ('from', '[email protected]'), 
    ('expires', '2018-04-25 18:45:48.3166159'), 
    ('command', 'method.exec'), 
    ('params', 
      OrderedDict(
        [
          ('method', 'cmd'), 
          ('Key', 'default'),
          ('params', 
            OrderedDict(
              [
               ('command', 'testing 23')
              ]
            )
          )
        ]
      )
    )
  ]
)

pkmbmrz7

pkmbmrz73#

id是一个关键字。你可以把字典作为参数传递。

ids = "de"
keystore = "1234567"
expires = "2018-04-25 18:45:48.3166159"
pdict = {
          "method" : "cmd",
          "Key" : "default",
          "params" : {
            "command" : "testing 23"
                     }
         }
json_payload = OrderedDict(
                            [('id', id),
                                ('Key', keystore),
                                ('from', '[email protected]'),
                                ('expires', expires),
                                ('command', 'method.exec'),
                                ('params',pdict )
                            ]
                           )
print(json.dumps(json_payload, indent=4, default=str))

字符串

kzipqqlq

kzipqqlq4#

工作!!

主要是当我们序列化查询集而不是模型示例时,例如:

serialized_data = SnippetSerializer(MyModel.objects.all(), many=True)

字符串
输出量:

[
OrderedDict([('code', 'ABC'),  ('quantity', 5.0)]),
OrderedDict([('code', 'GGG'), ('quantity', 4.0)])
]


我们可以像这样将其转换为JSON:

from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
import io
result = JSONRenderer().render(serialized_data)
output_stream = io.BytesIO(result)
data = JSONParser().parse(output_stream)
print(data)


输出量:

[
    {'code': 'ABC', 'quantity': 5.0}, 
    {'code': 'GGG', 'quantity': 4.0}
]

kcugc4gi

kcugc4gi5#

感谢@Nids Barthwal的回答,我能够绕过json_script模板标签的限制。我使用JSONRenderer策略创建了一个自定义标签:

@register.filter(name='ordereddict_to_json')
def ordereddict_to_json(value):
    result = JSONRenderer().render(value)
    output_stream = io.BytesIO(result)
    data = JSONParser().parse(output_stream)
    return json.dumps(data)

字符串
.一旦我将其插入数据属性.

<div id="foo" data-datavalue='{{ contextThing|ordereddict_to_json }}'>
    //  Something dynamically rendered in javascript
</div>


.很容易在前端拿起它:

function renderMyThing(thing) {
    let dataValue = thing.data("datavalue")
    let htmlString = `This part: ${dataValue.something} and also this other part: ${dataValue.somethingElse}`
    
    // ...
}

相关问题