如果某些键不是字符串,如何将Python dict转换为JSON?

时间:2017-01-25 20:12:12

标签: python json

Python dict的JSON等价物是一个JSON对象。但是它的键必须是字符串,这是一个众所周知的限制。

我还需要支持布尔和数字键。我可以创建一个简单的Python值< - > JSON字符串一对一翻译:

False <--> "bool:False"
42 <--> "int:42"
"Foo" <--> "str:Foo"

但我想问一下是否有一些现有的建议或某种标准。只需要与之兼容的任何东西。

3 个答案:

答案 0 :(得分:1)

JSON无法做到这一点,我不知道任何广泛使用的JSON扩展,允许您这样做。您必须自己编写序列化程序和反序列化程序,如果您继承json.JSONEncoderjson.JSONDecoder,这可能不会那么困难。

如果您能够切换协议,则有JSON-ish协议支持非字符串密钥。 MessagePack是一个:

case "POSTS_REQUEST_SUCCESS":
  return {
    ...state,
    areLoading: false,
    items: action.data
  }

答案 1 :(得分:0)

这可以达到你想要的效果:

>>> import json
>>> data = {False: 'this data', 42: 'answer', 'foo': 'bar'}
>>> json.dumps({"%s:%s" % (type(k).__name__, k): v for k, v in data.items()})
'{"int:42": "answer", "str:foo": "bar", "bool:False": "this data"}'

然后你必须反序列化它,它只适用于基本类型。

答案 2 :(得分:0)

由于您无法发布标准JSON,为什么不使用str序列化和ast.literal_eval(标准包)进行反序列化?

>>> d = {'a': 33, 23:(4,5), False: 10, 4: "foo"}
>>> a = str(d)   # convert the python structure to a string
>>> d2 = ast.literal_eval(a)
>>> print(d2)  # evaluate the a literal to a python structure
{False: 10, 4: 'foo', 'a': 33, 23: (4, 5)}
>>> d2 == d   # are those the same before & after evaluation ?
True