Python 恢复Json中结构错误的数据库行

Python 恢复Json中结构错误的数据库行,python,json,database,Python,Json,Database,我必须用python恢复一个数据库,我有很多行是用糟糕的json写的 下面是我的json数据库示例: { "name":"Nazamiu0304 Rau0304majiu0304", "personal_name":"Nazamiu0304 Rau0304majiu0304", "last_modified":{ "type":"/type/datetime", "value":"2008-08-20T18:00:41.270799" }, "key":"

我必须用python恢复一个数据库,我有很多行是用糟糕的json写的

下面是我的json数据库示例:

{ 
  "name":"Nazamiu0304 Rau0304majiu0304",
  "personal_name":"Nazamiu0304 Rau0304majiu0304",
  "last_modified":{ 
    "type":"/type/datetime",
    "value":"2008-08-20T18:00:41.270799"
  },
  "key":"/authors/OL1001461A",
  "type":{ 
    "key":"/type/author"
  },
  "revision":2
}
{ 
  "name":"Harald A. Enge",
  "personal_name":"Harald A. Enge",
  "created":{ 
    "type":"/type/datetime",
    "value":"2008-04-01T03:28:50.625462"
  },
  "alternate_names":[ 
    "Harald A Enge"
  ],
  "last_modified":{ 
    "type":"/type/datetime",
    "value":"2013-02-25T09:47:06.574533"
  },
  "latest_revision":3,
  "key":"/authors/OL1001542A",
  "type":{ 
    "key":"/type/author"
  },
  "revision":3
}
正如您所看到的,它不是真正的json,所以在python中,我对所有行进行了恢复,就像它是json一样,这要感谢解析方法和批处理代码

但问题是,我的名字、人名、姓氏修饰词的结构并不总是相同的。。。。 有时我还有其他信息,比如死亡日期,生物。。。 我可以恢复所有的数据库,除非信息“bio”在这里

我向你展示:

{ 
  "bio":{ 
    "type":"/type/text",
    "value":"> "Eversley, William Pinder, B.C.L. Queen's Coll., Oxon, M.A., a member of the South-eastern circuit, reporter for Law Times in Queen's Bench division, a student of the Inner Temple 14 April, 1874 (then aged 23), called to the bar 25 April, 1877 (eldest son of William Eversley, Esq., of London); born u2060, 1851. rn> rn> 7, King's Bench Walk, Temple, E.C." rn> ...[in Foster's Men at the Bar][1]rnrnrn rnrn[1]: https://en.wikisource.org/wiki/Men-at-the-Bar/Eversley,_William_Pinder "Men at the Bar""
  },
  "name":"William Pinder Eversley",
  "created":{ 
    "type":"/type/datetime",
    "value":"2008-04-01T03:28:50.625462"
  },
  "death_date":"1918",
  "photos":[ 
    6897255,
    6897254
  ],
  "last_modified":{ 
    "type":"/type/datetime",
    "value":"2018-07-31T15:39:07.982159"
  },
  "latest_revision":6,
  "key":"/authors/OL1003081A",
  "birth_date":"1851",
  "personal_name":"William Pinder Eversley",
  "type":{ 
    "key":"/type/author"
  },
  "revision":6
}
使用python编写的代码,我无法恢复行“bio”:{……}所以我做了一个循环,循环中所有行(name_personal_name…bio除外)

我试了很多方法来恢复线路


首先,我尝试将'per`like'替换为Queen's per example,所以当我批量执行时,它可以工作,但我遇到了另一个值错误:您需要一些正则表达式来修复混乱的数据。例如,对于bio字段,您需要匹配“bio”名称及其值,其中包含“类型”字段和“值”字段。然后对“value”字段执行相同的操作:然后可以修复引号

以下是一种方法:

重新导入
导入json
导入pprint
bio_regex=re.compile(
r”“”
(“bio”:\s*{)#bio字段开始
(.*)#内容
(},)#生物场结束
(?=\s*(?:“\w+”|}))#后跟另一个或json结尾
""",
flags=re.VERBOSE | re.DOTALL)
value_regex=re.compile(
r”“”
(“值”:\s*”)#值字段开始
(.*)#内容
(“\s*\Z)#值字段结束+字符串结束
""",
flags=re.VERBOSE | re.DOTALL)
def标准化_值(mo):
开始、内容、结束=mo.group(1、2、3)
content=content.replace(“,“\\”)
返回开始+内容+结束
def正常化生物(mo):
开始、内容、结束=mo.group(1、2、3)
content=value\u regex.sub(标准化值,内容)
返回开始+内容+结束
凌乱的_json=“”
{ 
“生物”:{
“类型”:“/类型/文本”,
“价值”:“>”埃弗斯利,威廉·平德,B.C.L.皇后学院,Oxon,M.A.,东南巡回赛成员,女王长凳区《法律时报》记者,1874年4月14日内神庙的一名学生(当时23岁),1877年4月25日获得律师资格(伦敦埃弗斯利的长子);生于1851年2月2060日。北卡罗来纳州坦普尔国王长凳步道rn>rn>7.“rn>…[在酒吧的福斯特手下][1]rnrnrn[1]:https://en.wikisource.org/wiki/Men-at-the-Bar/Eversley“酒吧里的男人”
},
“姓名”:“威廉·平德·埃弗斯利”,
“已创建”:{
“类型”:“/type/datetime”,
“值”:“2008-04-01T03:28:50.625462”
},
“死亡日期”:“1918年”,
“照片”:[
6897255,
6897254
],
“上次修改”:{
“类型”:“/type/datetime”,
“价值”:“2018-07-31T15:39:07.982159”
},
“最新修订”:6,
“密钥”:“/authors/OL1003081A”,
“出生日期”:“1851年”,
“个人姓名”:“威廉·平德·埃弗斯利”,
“类型”:{
“键”:“/类型/作者”
},
“修订”:6
}"""
result=bio\u regex.sub(规范化\u bio、凌乱\u json)
obj=json.loads(结果)
结果如下:


{'bio': {'type': '/type/text',
         'value': '> "Eversley, William Pinder, B.C.L. Queen\'s Coll., Oxon, M.A., a member of the '
                  "South-eastern circuit, reporter for Law Times in Queen's Bench division, a student of "
                  'the Inner Temple 14 April, 1874 (then aged 23), called to the bar 25 April, 1877 (eldest '
                  "son of William Eversley, Esq., of London); born u2060, 1851. rn> rn> 7, King's Bench "
                  'Walk, Temple, E.C." rn> ...[in Foster\'s Men at the Bar][1]rnrnrn rnrn[1]: '
                  'https://en.wikisource.org/wiki/Men-at-the-Bar/Eversley,_William_Pinder "Men at the Bar"'},
 'birth_date': '1851',
 'created': {'type': '/type/datetime', 'value': '2008-04-01T03:28:50.625462'},
 'death_date': '1918',
 'key': '/authors/OL1003081A',
 'last_modified': {'type': '/type/datetime', 'value': '2018-07-31T15:39:07.982159'},
 'latest_revision': 6,
 'name': 'William Pinder Eversley',
 'personal_name': 'William Pinder Eversley',
 'photos': [6897255, 6897254],
 'revision': 6,
 'type': {'key': '/type/author'}}


您可以使用它来修复程序。

json记录之间缺少逗号。包含引号的字符串不会转义。请重新格式化您的Python代码,删除无用的行(注释…)。非常感谢您,伙计,我今晚尝试了它,我将在明天向您展示我的结果!!你好我从上次开始做了一些事情,我又回到了bio的问题上,我编辑了其他事情,但现在我需要回到这个问题上,所以我可以再次问你一些关于我在bio上的新问题吗?请发布一个新问题,以便更好地了解。我把它放在这个帖子上,这是一个问题吗?这是我的新职位