import json
def RawJSONDecoder(index):
class _RawJSONDecoder(json.JSONDecoder):
end = None
def decode(self, s, *_):
data, self.__class__.end = self.raw_decode(s, index)
return data
return _RawJSONDecoder
def extract_json(s, index=0):
while (index := s.find('{', index)) != -1:
try:
yield json.loads(s, cls=(decoder := RawJSONDecoder(index)))
index = decoder.end
except json.JSONDecodeError:
index += 1
s = '''...some {{bad brackets} and empty brackets {} <= still valid JSON though...
{
"1":"one",
"2":"two",
"3":{
"31":{
"311":"threeoneone",
"312":"threeonetwo",
"313":"threeonethree"
}
},
"4":{
"41":"fourone",
"42":"fourtwo",
"43":"fourthree"
},
"5":"five",
"6":"six"
}
...some more random text...'''
print(*extract_json(s), sep='\n')
aW1wb3J0IGpzb24KCmRlZiBSYXdKU09ORGVjb2RlcihpbmRleCk6CiAgICBjbGFzcyBfUmF3SlNPTkRlY29kZXIoanNvbi5KU09ORGVjb2Rlcik6CiAgICAgICAgZW5kID0gTm9uZQoKICAgICAgICBkZWYgZGVjb2RlKHNlbGYsIHMsICpfKToKICAgICAgICAgICAgZGF0YSwgc2VsZi5fX2NsYXNzX18uZW5kID0gc2VsZi5yYXdfZGVjb2RlKHMsIGluZGV4KQogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgcmV0dXJuIF9SYXdKU09ORGVjb2RlcgoKZGVmIGV4dHJhY3RfanNvbihzLCBpbmRleD0wKToKICAgIHdoaWxlIChpbmRleCA6PSBzLmZpbmQoJ3snLCBpbmRleCkpICE9IC0xOgogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQganNvbi5sb2FkcyhzLCBjbHM9KGRlY29kZXIgOj0gUmF3SlNPTkRlY29kZXIoaW5kZXgpKSkKICAgICAgICAgICAgaW5kZXggPSBkZWNvZGVyLmVuZAogICAgICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICAgICAgaW5kZXggKz0gMQoKcyA9ICcnJy4uLnNvbWUge3tiYWQgYnJhY2tldHN9IGFuZCBlbXB0eSBicmFja2V0cyB7fSA8PSBzdGlsbCB2YWxpZCBKU09OIHRob3VnaC4uLgoKewogICAiMSI6Im9uZSIsCiAgICIyIjoidHdvIiwKICAgIjMiOnsKICAgICAgIjMxIjp7CiAgICAgICAgICIzMTEiOiJ0aHJlZW9uZW9uZSIsCiAgICAgICAgICIzMTIiOiJ0aHJlZW9uZXR3byIsCiAgICAgICAgICIzMTMiOiJ0aHJlZW9uZXRocmVlIgogICAgICB9CiAgIH0sCiAgICI0Ijp7CiAgICAgICI0MSI6ImZvdXJvbmUiLAogICAgICAiNDIiOiJmb3VydHdvIiwKICAgICAgIjQzIjoiZm91cnRocmVlIgogICB9LAogICAiNSI6ImZpdmUiLAogICAiNiI6InNpeCIKfQoKLi4uc29tZSBtb3JlIHJhbmRvbSB0ZXh0Li4uJycnCnByaW50KCpleHRyYWN0X2pzb24ocyksIHNlcD0nXG4nKQ==
{}
{'1': 'one', '2': 'two', '3': {'31': {'311': 'threeoneone', '312': 'threeonetwo', '313': 'threeonethree'}}, '4': {'41': 'fourone', '42': 'fourtwo', '43': 'fourthree'}, '5': 'five', '6': 'six'}