解析包含“objects”的JSON

2024-04-27 04:06:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个应用程序中获取数据,该应用程序返回的似乎是JSON,但带有一些“对象”。例如:

{"rgEvtData":[new VisData(0,0,1,0,1,0,0,0,0,-1),new VisData(0,1,1,1,1,0,0,0,0,-1),new VisData(0,2,1,2,1,0,0,0,0,-1),new VisData(0,3,2,0,1,0,0,0,0,-1),new VisData(0,4,2,1,1,0,0,0,0,-1),new VisData(0,5,2,2,1,0,0,0,0,-1),new VisData(0,6,2,3,1,0,0,0,0,-1),new VisData(0,7,3,0,1,0,0,0,0,-1),new VisData(0,8,3,1,1,0,0,0,0,-1)]}

你知道我是否可以在python上解析它而不需要麻烦的解决方法(例如replace()或regexp)吗?你知道吗


Tags: 对象方法json应用程序newreplaceregexprgevtdata
1条回答
网友
1楼 · 发布于 2024-04-27 04:06:00

不,你不能。
即使python可以解析它,它会用VisData做什么?你知道吗

我认为您唯一的选择(除了上面提到的stick方法)是以某种方式将这个字符串转换成有效的JSON。例如,将new VisData(...)替换为[...],或者{"class": "VisData", "args": [...]}(如果您有多个类名)。但你说过你不想那样。你知道吗

更新
我有一个例子,我想这正是你需要的。
它以您提供的格式处理自定义类。 它还可以处理多个类和任意数量/类型的构造函数参数。你知道吗

import re
import json

# our python VisData class
class VisData(object):
    def __init__(self, *args):
        self.args = args

# object hook to convert our {"class":"VisData","args":[...]} dict to VisData insances
def object_hook(obj):
    # if we recognize our object describer dict
    if len(obj) == 2 and "class" in obj and "args" in obj:
        # instantiate our classes by name
        clazz = globals()[obj["class"]]
        args = obj["args"]
        return clazz(*args)
    return obj

# input
input_string = '{"rgEvtData":[new VisData(0,0,1,0,1,0,0,0,0,-1),new VisData(0,1,1,1,1,0,0,0,0,-1)]}'

# make it json
json_string = re.sub(r'new (\w+)\(([^\)]*)\)', r'{"class":"\1","args":[\2]}', input_string)

# parse it with our object hook
data = json.loads(json_string, object_hook=object_hook)

# result
print(data)                         # -> {u'rgEvtData': [<__main__.VisData object at 0x1065d8210>, <__main__.VisData object at 0x1065d8250>]}
print(data["rgEvtData"][0])         # -> <__main__.VisData object at 0x1065d8210>
print(data["rgEvtData"][0].args)    # -> (0, 0, 1, 0, 1, 0, 0, 0, 0, -1)

相关问题 更多 >