在python中将列表转换为json,json.loads()错误

时间:2014-05-20 10:13:51

标签: python json

解析一些java脚本回调后,我已经完成了修剪并获得了类似json的对象。 现在我需要从中获取一些数据并构建具有已定义结构的新json。

我用regexp完成了这个解析 massive_string,你可以在这里找到:CALLBACK

Result = re.findall(r"\{\"catalogItemId\"\:.*\}", massive_string)

修剪结果为列表类型,如下所示:

['{"catalogItemId":"7549510","businessCatalogItemId":"950691","name":"Linen Full-Zip Sweater Jacket","catalogItemTypeId":"3","catalogItemSubtypeId":"13","isInStock":"true","inventoryStatusId":"0","sizeCategoryId":"0","defaultVariantId":"2","productStyleVariantList":[{"variantId":"1","variantName":"Regular","productStyleColors":[{"catalogItemId":"7549593"
 # ... some Stuff here ...
"hasAlternateImage":"false","hasCrossSell":"false","hasFitAttributeOverlayImages":"false","hasMergeVariants":"false","hasSplitVariants":"false","isGiftCard":"false","isImported":"true","careInstructionText":"Hand wash or dry clean.","flammableWarningText":"","marketingFlag":{"marketingFlagFormatId":"1","marketingFlagId":"102077","marketingFlagTypeId":"1","marketingFlagName":"Available in XS-XXL & Tall Online"},"onlyAvailableOnline":"false"},"localeInfo":{"supportedLocales":"en_US","responseLocale":"en_US"}}}']

所以我需要做类似的事情:

for i in Result:
    json.loads(i)

我得到了:

ValueError: Extra data: line 1 column 21264 - line 1 column 21333 (char 21263 - 21332)

如何找到所有需要的catalogItemId并使用其参数为每个catalogItemId构建个人JSON,以及如何修复json.loads()例外。

1 个答案:

答案 0 :(得分:1)

问题的解决方案实际上是删除了您要查询的网址的callback参数:

>>> import requests
>>> data = requests.get('http://m.bananarepublic.gap.com/gmo/product?shopid=2&pid=950691012&region=us&cid=5343&clientid=SKAVA').json()
>>> 
这样,您就不必对JSON数据进行杂乱的解析。回调参数只是一个可选的javascript技巧,用于调用现有函数,该函数将在接收到JSON时解析数据。正如您将在下一个示例中看到的那样,我使用参数callback=foo来更改生成的json中的回调名称。

最终,问题是你不能只删除删除字符串回调部分所需的内容,但是你试图匹配字符串中的数据:

>>> s = requests.get('http://m.bananarepublic.gap.com/gmo/product?shopid=2&pid=950691012&callback=foo&region=us&cid=5343&clientid=SKAVA').text
>>> s[0:60]
u'foo({"parentDivisionId":"5343","avgRating":0.0,"numRaters":0'

因此,当您使用贪婪的正则表达式运算符时:

r"\{\"catalogItemId\"\:.*\}"

你最终解析了字符串中不均匀数量的括号,最终得到的只是JSON。因为它匹配:

{"catalogItemId":foobar}

但也是:

{"catalogItemId":"foobar"}, {"foo":"bar"}, {"foo":"bar"}},{"otherDataSet":{"catalogItemId":"barfoo"}}}}
^                                                                                                     ^
`----------------------- matching between those two brackets: ----------------------------------------`

这是无效的JSON。要了解正则表达式的工作原理,请查看this demo

Regular expression visualization

您应该使用替换正则表达式删除回调,例如:

r"s/foo(\(.*\));/\1/"

贪婪的操作符将按照我们希望的方式工作:一切都到最后一个。