JavaScript 里的嵌套数组,转为字典的问题。。。

2021-02-22 11:18:37 +08:00
 qazwsxkevin

如:

JSArrayStr = """var foods = [[19,'奶油布丁','Cream Pudding','2719-3',0],[20,'日式多味卷','Japan Roll Cake','2719-166',0],[21,'虎皮千层','TigerSkin Cake','2719-27',0],[22,'肉松吐司','Meat Floss Toast','2719-5',0],[23,'巧克力布丁','Chocolate Pudding ','2719-13',0],[24,'法式长棍','Long Baguette','2719-2',0],[25,'提拉米苏','Tiramisu','2719-6',0],[26,'水果塔','Fruit Tower','2719-74',0],[27,'港式班戟','HK Pancake','2719-156',0]];"""

像是这种结构的数组,如果直接用 json.loads(JSArray)报错的,只能手工对 JSArrayStr 做文本硬处理吗?(硬处理指:手工逐个细节(split 又 strip)*N 次再写入到新字典)
Python 是否有更强大的轮子可以直接弄出字典?

2085 次点击
所在节点    Python
12 条回复
SakuraKuma
2021-02-22 11:47:04 +08:00
如果所有数据都是这样可以先把头的变量和尾的分号删了, 把引号都变"就可以转了.
rodrick
2021-02-22 11:50:15 +08:00
淦,看个数组看饿了
jones2000
2021-02-22 12:24:10 +08:00
字符串直接用 js 编译下, 不就出来了嘛。这个不就是 1 个 js 语句嘛。
Rhilip
2021-02-22 12:34:02 +08:00
如果字符串是这样的,那 eval 是最好的办法,直接从字面量变成 foods 变量,再 Array.map 就好,
如果 eval 不行,那就用 new Function(JSArrayStr + ';return foods;')() 获取 foods 变量
Rhilip
2021-02-22 12:36:57 +08:00
哦,这是在 Python 中解析 javascript ? 那就只能参照 1L,掐头去尾做替换了
palmers
2021-02-22 12:42:28 +08:00
JSON.parse("var foods = [[19,'奶油布丁','Cream Pudding','2719-3',0],[20,'日式多味卷','Japan Roll Cake','2719-166',0],[21,'虎皮千层','TigerSkin Cake','2719-27',0],[22,'肉松吐司','Meat Floss Toast','2719-5',0],[23,'巧克力布丁','Chocolate Pudding ','2719-13',0],[24,'法式长棍','Long Baguette','2719-2',0],[25,'提拉米苏','Tiramisu','2719-6',0],[26,'水果塔','Fruit Tower','2719-74',0],[27,'港式班戟','HK Pancake','2719-156',0]];".split('=')[1].split(';')[0].replaceAll("\'", "\""));
palmers
2021-02-22 12:42:49 +08:00
然后遍历处理就可以了吧?
palmers
2021-02-22 12:43:48 +08:00
楼主你这个字符串 我认为不可能有一个到位的轮子 这完全是一个个性的字符串 没有业务通用性
JellyL
2021-02-22 13:17:07 +08:00
是用 python 在做 ast 语义分析吗?
那要用 ast 库,json.loads()不一定直接起作用
前面的截取没用 strip,如果都是这种用单引号结构化的纯数组 js,直接 index 吧

```
import ast

JSArrayStr = """var foods = [[19,'奶油布丁','Cream Pudding','2719-3',0],[20,'日式多味卷','Japan Roll Cake','2719-166',0],[21,'虎皮千层','TigerSkin Cake','2719-27',0],[22,'肉松吐司','Meat Floss Toast','2719-5',0],[23,'巧克力布丁','Chocolate Pudding ','2719-13',0],[24,'法式长棍','Long Baguette','2719-2',0],[25,'提拉米苏','Tiramisu','2719-6',0],[26,'水果塔','Fruit Tower','2719-74',0],[27,'港式班戟','HK Pancake','2719-156',0]];"""

startIndex = JSArrayStr.index('[')
endIndex = JSArrayStr.index(';')
temp = JSArrayStr[startIndex:endIndex]

result = ast.literal_eval(temp)
print(result)

```
no1xsyzy
2021-02-22 14:50:39 +08:00
看上去可以截头去尾然后 ast.literal_eval
nekochyan
2021-02-22 16:01:12 +08:00
你这个不是嵌套数组问题,是你这段字符串本身是一句 js 可执行代码,需要自己掐去头尾分析
krixaar
2021-02-22 16:27:50 +08:00
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

chrome_options = Options()
chrome_options.headless = True
driver = webdriver.Chrome(options=chrome_options)
result = json.loads(driver.execute_script(JSArrayStr+'return JSON.stringify(foods);'))
driver.quit()

现代问题需要现代手段.jpg

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/755023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX