如何在python中解析一个看起来像JSON的字符串,其中包含许多嵌入类?

2024-09-29 18:59:01 发布

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

我有一个字符串,它列出了请求事件的属性。你知道吗

我的字符串看起来像:

requestBody: {
    propertyA = 1
    propertyB = 2
    propertyC = {
        propertyC1 = 1
        propertyC2 = 2
    }
    propertyD = [
        { propertyD1 = { propertyD11 = 1}},
        { propertyD1 = [ {propertyD21 = 1, propertyD22 = 2}, 
                         {propertyD21 = 3, propertyD22 = 4}]}
    ]
}

我已经尝试用":"替换"=",这样我就可以将它放入python中的JSON读取器中,但是JSON还要求将键和值存储在带有双引号的字符串中,并用","分隔每一对。这就变得有点复杂了。有什么更好的方法可以将其解析为结构完全相同的python字典(例如,还保留了嵌入的字典)?你知道吗

问题: 如果我要编写一个完整的解析器,我应该处理的主要模式是什么?将括号存储在堆栈中直到括号完成?你知道吗


Tags: 字符串json字典属性事件括号propertybpropertya
1条回答
网友
1楼 · 发布于 2024-09-29 18:59:01

这是使用pyparsing的一个很好的例子,特别是因为它增加了递归结构的问题。你知道吗

简单的回答是以下解析器(处理前导requestBody :之后的所有内容):

LBRACE,RBRACE,LBRACK,RBRACK,EQ = map(Suppress, "{}[]=")
NL = LineEnd().setName("NL")

# define special delimiter for lists and objects, since they can be
# comma-separated or just newline-separated
list_delim = NL | ','
list_delim.leaveWhitespace()

# use a parse action to convert numeric values to ints or floats at parse time
def convert_number(t):
    try:
        return int(t[0])
    except ValueError:
        return float(t[0])
number = Word(nums, nums+'.').addParseAction(convert_number)

qs = quotedString

# forward-declare value, since it will be defined recursively
obj_value = Forward()

ident = Word(alphas, alphanums+'_')
obj_property = Group(ident + EQ + obj_value)

# use Dict wrapper to auto-define nested properties as key-values
obj = Group(LBRACE + Dict(Optional(delimitedList(obj_property, delim=list_delim))) + RBRACE)

obj_array = Group(LBRACK + Optional(delimitedList(obj, delim=list_delim)) + RBRACK)

# now assign to previously-declared obj_value, using '<<=' operator
obj_value <<= obj_array | obj | number | qs

# parse the data
res = obj.parseString(sample)[0]

# convert the result to a dict
import pprint
pprint.pprint(res.asDict())

给予

{'propertyA': 1,
 'propertyB': 2,
 'propertyC': {'propertyC1': 1, 'propertyC2': 2},
 'propertyD': {'propertyD1': {'propertyD11': 1},
               'propertyD2': {'propertyD21': 3, 'propertyD22': 4}}}

相关问题 更多 >

    热门问题