json怎么获取key值(js解析json字符串获取key)
json怎么获取key值(js解析json字符串获取key),本文通过数据整理汇集了json怎么获取key值(js解析json字符串获取key)相关信息,下面一起看看。
在爬虫开发过程中,我们经常会遇到一些Ajax加载的接口会返回JSON数据。如下图所示,是Twitter & # 039的用户时间轴接口,它返回一个深度嵌套的JSON,有3000多行:
光标字段是请求下一页的必要字段。我必须读取它的值,并将其拼接到请求URL中,然后才能请求下一页的内容。
现在的问题是,这个JSON中的游标字段在哪里?从最外层开始,如何读取最内层游标中value字段的值?
我知道已经有一些第三方库可以根据字段名直接读取JSON中任意深度的值,但是用别人的就没那么享受了& # 039;比如你自己写一个轮子。所以今天我们就自己动手写一个模块。我将其称为JsonPathFinder,传入一个JSON字符串和要读取的字段的名称,并返回从最外层到该字段的路径。
演示我们用Python之父龟叔的Twitter时间轴作为演示。运行后,效果如下图所示:
可以看到,从最外层开始一路读取cursor字段需要很多字段名,对应JSON,如下图所示:
因为条目字段列表中有20个元素,所以这里的18和19实际上对应于倒数第二个和倒数第二个数据。倒数第二个光标对应于该页面上的第一条推文,而倒数第二个光标对应于该页面上的最后一条推文。所以当我们想翻页的时候,应该使用倒数第二个光标。
让& # 039;让我们来看看结果:
很容易得到数据。没有必要用肉眼在JSON中寻找字段。
原理分析JsonPathFinder的原理并不复杂。所有代码加上空行总共只有32行,如下图所示:
因为一个字段可能在JSON中出现多次,所以find_one方法返回从外层到目标字段的第一个路径。而find_all方法返回从外层到目标字段的所有路径。
核心算法是iter_node方法。该方法在将JSON字符串转换成Python字典或list后,使用depth-first遍历整个数据,记录它经过的每一个字段,如果遇到list,就以list的索引为键。结束此路径,直到遍历完目标字段,或者某个字段的值不是列表或字典,并继续遍历下一个节点。
代码的第10-15行分别处理列表和字典。对于字典,我们将键和值分开,并写成:
Forkey,valueinxxx.items():对于列表,我们将索引从元素中分离出来,并写成:
对于INDEX,ElementENUMERATE (XXX):所以,和第11行和第13行一样,字典和列表由生成器派生处理,这样key_value_iter生成器对象就可以被第16行的同一个for循环迭代。
我们知道,除了字典和列表,Python中还有很多其他可以迭代的对象,但我这里只处理字典和列表。也可以尝试修改10-15行的条件判断,增加其他迭代对象的处理逻辑。
代码的第16-22行迭代处理过的键值。首先记录到current_path列表中当前字段的迭代路径。然后判断当前场是否是目标场。如果是,那么通过yield抛出当前路径。如果当前路径的值是一个列表或字典,那么递归地将这个值传递给iter_node方法,以进一步检查里面是否有任何目标字段。需要注意的是,不管当前字段是不是目标字段,只要它的值是列表或者字典,就需要继续迭代。即使当前字段的名称是目标字段,它内部的子字段的字段名称也可能是目标字段名称。
对于普通函数,要递归调用,直接返回当前函数(参数)即可。但是对于生成器,要递归调用,需要使用yield from current function name(参数)。
因为iter_node方法返回一个generator对象,所以在find_one和find_all方法中,for循环的每次迭代都可以得到一个从20行到目标字段抛出的路径。在find_one方法中,当我们得到第一条路径时,我们不& # 039;t继续迭代,这样可以节省很多时间,减少迭代次数。
正确使用这个工具后,我们可以直接用它来分析数据,也可以用来帮助分析数据。比如Twitter timeline的文本在full_text中,我可以用JsonPathFinder直接获取所有文本:
但有时,除了获取文本,我们还需要每条推文的其他信息,如下图所示:
正如您所看到的,在这种情况下,我们可以首先获得从外层到full_text的路径列表,然后手动处理该列表以帮助开发:
从打印的路径列表中可以看到,我们只需要获得globalObjects-tweets。它的值是20个字典,每个字典的键是推文的ID,值是推文的细节。这时,我们可以通过手动修改代码,轻松提取一条tweet的所有字段。
更多json怎么获取key值(js解析json字符串获取key)相关信息请关注本站。