Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取错误的json,解析示例_Python_Json_Parsing - Fatal编程技术网

Python 读取错误的json,解析示例

Python 读取错误的json,解析示例,python,json,parsing,Python,Json,Parsing,我读的是一种格式不正确的json。我尝试过不同的解析器,但没有一个适合这种格式的特殊编码。有什么想法吗 我尝试了几个包,但没有一个包能够捕获每个json寄存器中的所有字段 { } 我希望代码能够正确识别所有字段并提取格式错误的json,我有100多万个相同格式的寄存器。有什么想法吗?我不建议您再编写一个JSON解析器,而是建议您利用Python是一种动态语言这一事实,将您拥有的数据转换为有效的Python,并让解释器为您解析。为了证明评论中的建议有效,请尝试以下内容 >>> N

我读的是一种格式不正确的json。我尝试过不同的解析器,但没有一个适合这种格式的特殊编码。有什么想法吗

我尝试了几个包,但没有一个包能够捕获每个json寄存器中的所有字段

{

}


我希望代码能够正确识别所有字段并提取格式错误的json,我有100多万个相同格式的寄存器。有什么想法吗?

我不建议您再编写一个JSON解析器,而是建议您利用Python是一种动态语言这一事实,将您拥有的数据转换为有效的Python,并让解释器为您解析。为了证明评论中的建议有效,请尝试以下内容

>>> NumberInt = int
>>> ObjectId = str
>>> ISODate = str      # I leave a lambda that calls time.strptime() as an exercise
>>> true = True
>>> false = False
>>> null = None
>>> mydict = eval("""{
"_id" : ObjectId("5c187d6caf0ffa6162eb4f5c"), 
"SDKVersion" : "6.1.7", 
"aaid" : "248c3ab3-919b-4525-b6cc-2c662504235d", 
"appVersion" : "6.2.4", 
"dateTime" : ISODate("2018-12-18T04:32:55.000+0000"), 
"device" : "samsung", 
"id" : NumberInt(5712), 
"installReferrer" : "", 
"isFirstRun" : false, 
"json" : null, 
"language" : "KO", 
"mcc" : NumberInt(450), 
"mnc" : NumberInt(5), 
"model" : "SM-G885S", 
"notificationId" : NumberInt(0), 
"pixelHeight" : NumberInt(2094), 
"pixelWidth" : NumberInt(1080), 
"runningSecs" : NumberInt(0), 
"status" : "pageview", 
"udid" : "6b2be43d1f1fc05c", 
"userDoc" : "", 
"userIdGA" : "", 
"version" : "8.0.0 (26)", 
"wifi" : false, 
"pagename" : "com.mo2o.alsa.modules.passengers.presentation.form.FormPassengersActivity", 
"remoteAddr" : "223.62.215.198", 
"server" : "web26", 
"serverQueueuDateTime1" : "20181218053257", 
"serverQueueuDateTime2" : ISODate("2018-12-18T04:32:57.000+0000"), 
"apiVersion" : "2.0.0", 
"dateTime2" : "2018-12-18T13:32:55+0900"
}""")
调用
eval()
会导致:

>>> mydict
{'userIdGA': '', 'device': 'samsung', 'mnc': 5, 'id': 5712, 'isFirstRun': False, 'serverQueueuDateTime1': '20181218053257', 'appVersion': '6.2.4', 'serverQueueuDateTime2': '2018-12-18T04:32:57.000+0000', 'json': None, 'version': '8.0.0 (26)', 'runningSecs': 0, 'userDoc': '', 'server': 'web26', 'status': 'pageview', 'SDKVersion': '6.1.7', 'mcc': 450, 'dateTime2': '2018-12-18T13:32:55+0900', 'pixelWidth': 1080, 'notificationId': 0, 'pixelHeight': 2094, 'language': 'KO', 'udid': '6b2be43d1f1fc05c', 'wifi': False, 'aaid': '248c3ab3-919b-4525-b6cc-2c662504235d', 'apiVersion': '2.0.0', 'dateTime': '2018-12-18T04:32:55.000+0000', 'installReferrer': '', 'pagename': 'com.mo2o.alsa.modules.passengers.presentation.form.FormPassengersActivity', 'model': 'SM-G885S', '_id': '5c187d6caf0ffa6162eb4f5c', 'remoteAddr': '223.62.215.198'}
要回答您关于嵌入式dict的问题:

>>> mydict = eval("""{
"_id" : ObjectId("5c187d6caf0ffa6162eb4f5c"),
"SDKVersion" : "6.1.7",
"aaid" : "248c3ab3-919b-4525-b6cc-2c662504235d",
"appVersion" : "6.2.4",
"dateTime2" : "2018-12-18T13:32:55+0900",
"additional" : { "sell" : "Evento de compra" }
}""")
这是一个故意缩短的示例版本,以节省空间。它给出:

>>> mydict
{'SDKVersion': '6.1.7', 'additional': {'sell': 'Evento de compra'}, 'aaid': '248c3ab3-919b-4525-b6cc-2c662504235d', 'dateTime2': '2018-12-18T13:32:55+0900', 'appVersion': '6.2.4', '_id': '5c187d6caf0ffa6162eb4f5c'}

您可以尝试编写所有函数的模拟(如
ISODate()
),然后将其视为普通
dict
的字符串表示,并对其调用
eval()
。然后,您可以利用Python解析器来完成繁重的工作。只要确保你的函数对它们接受的参数很挑剔,这可能是一个解决方案。但是,我也有一个问题,在一些寄存器中,我有一个字段“additional”:{“sell”:“Evento de compra”},这可能会混淆到dict的转换,有什么想法吗?为什么?Python解析器将处理嵌套为另一个
dict
中的值的
dict
。请注意:这不是“无效的json”,这根本不是json。感谢您的建议。如果我必须阅读100万个寄存器,其中一个有sell格式,另一个没有sell格式,那么最后一个如何工作呢?。用{}解析每个寄存器,并对每个寄存器应用eval?我想我不理解这个问题。无论您是否有嵌入式
dict
,都可以使用
eval()
。这就是这个例子的要点。您将
eval()
应用于整个输入字符串,解析器将处理任何级别的任何嵌入式
dict
s。我想你应该举六个有代表性的例子,完全按照我在答案中所做的去做,看看会发生什么。然后你就可以处理任何真正出现的问题,而不是去想象它们。您不太可能找到第三方解决方案,因此您需要集中精力构建自己的解决方案。@AndresRuizDeElv如果答案对您有效,请接受它。
>>> mydict
{'SDKVersion': '6.1.7', 'additional': {'sell': 'Evento de compra'}, 'aaid': '248c3ab3-919b-4525-b6cc-2c662504235d', 'dateTime2': '2018-12-18T13:32:55+0900', 'appVersion': '6.2.4', '_id': '5c187d6caf0ffa6162eb4f5c'}