0

字符串的组成如下:

{resp_to={request=objects_download}|objects={object1={object_name=Name of object 1|objecttype=type1}|object2={object_name=Name of object 2|objecttype=type1}}|error=0}

提取对象中包含的所有对象的所有对象名称的最佳方法是什么?

我对 json 感到困惑,它让我疯狂地理解它是如何工作的。

4

1 回答 1

0

您可以使用递归下降解析器解析文本,例如lepl

from string import ascii_lowercase as lowercase, digits
from lepl import AnyBut, Delayed, Drop, Integer, Word

def Parser():
    # ABNF-ish grammar:
    #   object  = '{' pair *( '|' pair )  '}' # sequence of pairs inside {}
    #   pair    = key '=' value               # key, value separated by =
    #   value   = integer / string / object   # any of ..
    #   key     = [a-z_][a-z_0-9]* # regex syntax
    #   string  = [^{}=|]+         # regex syntax
    obj = Delayed() # forward declaration
    key = Word(lowercase + '_', lowercase + '_' + digits) # digit can't be 1st
    value = (Integer() >> int) | AnyBut('{}=|')[1:,...] | obj
    pair = key & Drop('=') & value > tuple # (key, value)
    obj += Drop('{') & pair[1:,Drop('|')]  & Drop('}') > dict
    return obj.get_parse()

例子:

import json

text = ("{resp_to={request=objects_download}|"
        "objects={object1={object_name=Name of object 1|objecttype=type1}"
        "|object2={object_name=Name of object 2|objecttype=type1}}|error=0}")
obj = Parser()(text)[0] # parse text into a dict
print(json.dumps(obj, indent=2)) # pretty print

输出:

{
  "resp_to": {
    "request": "objects_download"
  }, 
  "objects": {
    "object1": {
      "object_name": "Name of object 1", 
      "objecttype": "type1"
    }, 
    "object2": {
      "object_name": "Name of object 2", 
      "objecttype": "type1"
    }
  }, 
  "error": 0
}
于 2013-03-29T07:49:08.303 回答