在Python中序列化JSON

-1 投票
4 回答
1028 浏览
提问于 2025-04-17 17:26

我知道网上有很多关于json和python的问题,但我就是搞不懂这个。我想把两个列表保存到同一个文件里。为此,我创建了一个新的类来存放这两个列表:

class newJSON(object):
    def __init__(self, list1, list2):
        self.data = {'data': list1, 'info' : list2}

我希望生成的数据文件看起来像这样:

{
    "data" : [
        {
            "name" : "aName" ,
            "coordinates" : {"obj2" : 33, "obj3" : 71} 
        } , {
            "name" : "bName" ,
            "coordinates" : {"obj2" : 12, "obj3" : 77} 
        }
        ] ,
    "info" : [
        {
            "first" : ["xxx" , "yyy"] ,
            "space" : 21
        } , {
            "first" : ["aaa" , "bbb"] ,
            "space" : 12
        }
        ]
}

然后我去按照推荐的方法解码这个对象,具体可以参考将python对象实例序列化为JSON以及其他一些帖子:

jsonToEncode = newJSON(myList1, myList2)
myNewJSONData = json.dumps(jsonToEncode.__dict__)

但是我遇到了“不是JSON可序列化的错误”……我尝试过有和没有dict的情况,但都没有成功。生成的JSON必须是上面显示的格式。问题出在哪里呢?

谢谢

****编辑****

为了生成这两个列表,我使用一个格式完全和上面显示的json文件,然后做了以下操作:

list1 = [obj1(**myObj) for myObj in data["data"]]

list2也是这样做的。obj1是这样创建的:

class obj1(object):
    def__init__(self, name, coordinates): 
        self.name = name 
        self.coordinate = coordinates

4 个回答

0

试试这个:

myNewJSONData = json.dumps(jsonToEncode.data, indent=2)

或者试试这个:

>>> class newJSON2(dict):
...     def __init__(self, list1, list2):
...         self['data'] = list1
...         self['info'] = list2
>>> 
>>> 
>>> json2 = newJSON2(list1, list2)
>>> json2
{'info': [{'space': 21, 'first': ['xxx', 'yyy']}, {'space': 12, 'first': ['aaa', 'bbb']}], 'data': [{'name': 'aName', 'coordinates': {'obj3': 71, 'obj2': 33}}, {'name': 'bName', 'coordinates': {'obj3': 77, 'obj2': 12}}]}
>>> print json.dumps(json2, indent=2)
{
  "info": [
    {
      "space": 21, 
      "first": [
        "xxx", 
        "yyy"
      ]
    }, 
    {
      "space": 12, 
      "first": [
        "aaa", 
        "bbb"
      ]
    }
  ], 
  "data": [
    {
      "name": "aName", 
      "coordinates": {
        "obj3": 71, 
        "obj2": 33
      }
    }, 
    {
      "name": "bName", 
      "coordinates": {
        "obj3": 77, 
        "obj2": 12
      }
    }
  ]
}
>>> 
0

使用 simplejson 库。

from simplejson import loads, dumps
print loads(json_string) # Converts a JSON string to dict
print dumps(python_object) # Converts any valid python object/dict to valid JSON string

可以看看这个链接:https://pypi.python.org/pypi/simplejson

1

其实不需要新建一个对象。直接把字典序列化就可以了:

myNewJSONData = json.dumps({'data': list1, 'info': list2})

不过,你的代码本来应该能正常工作的。可能是你在 list1list2 里面有一些数据是不能被序列化的。

撰写回答