【问题标题】:How to print list of strings in dict in JSON如何在 JSON 中打印 dict 中的字符串列表
【发布时间】:2020-06-19 18:16:54
【问题描述】:

您好,我尝试打印 dll_loaded 列表

"behavior": {
    "generic": [
        {
            "process_path": "C:\\Windows\\System32\\wscript.exe", 
            "summary": {
                "dll_loaded": [
                    "C:\\Windows\\system32\\wshext.dll", 
                    "C:\\Windows\\system32\\advapi32.dll", 
                ]
             }
         }

但它总是给我这个错误TypeError: string indices must be integers

我尝试使用以下方式打印它

        for sys in json_data["behavior"]["generic"]:
            for sys1 in sys["summary"]:
                for sys2 in sys1["dll_loaded"]:
                    print(sys2)

我试图打印 sys1 的类型,它给了我<class 'str'>,不应该是一个列表吗? 然后尝试将 sys1 视为字符串并使用 range 和 len 打印,但只返回一个一个字符!

但我不确定我哪里出错了,有人可以帮忙吗? 我正在使用 Python 3.7

编辑
我尝试了 John P 的答案,它有效,但现在我面临另一个问题,例如 dll_loaded 不是列表中的第一个元素

"behavior": {
    "generic": [
        {
            "process_path": "C:\\Windows\\System32\\wscript.exe", 
            "summary": {
                "file_created": [
                    "C:\\Users\\Administrator\\AppData\\Roaming\\WinRAR\\version.dat"
                ], 
                "file_recreated": [
                    "\\Device\\DfsClient"
                ], 
                "directory_created": [
                    "C:\\Users\\Administrator\\AppData\\Roaming\\WinRAR"
                ], 
                "dll_loaded": [
                    "C:\\Windows\\system32\\wshext.dll", 
                    "C:\\Windows\\system32\\advapi32.dll", 
                ]
             }
         }

抱歉,我还是 Python 的初学者

【问题讨论】:

标签: python json python-3.x loops printing


【解决方案1】:

我认为您正在寻找的是这样的:

for sys in json_data["behavior"]["generic"][0]["summary"]['dll_loaded']:
    print(sys)

不需要3层for循环,因为你只对json_data["behavior"]["generic"][0]["summary"]['dll_loaded']生成的列表感兴趣。

关于你为什么 sys1 的类型是<class 'str'> 的问题,这是因为sys["summary"] 给出了一个单元素字典而不是一个列表。在for sys1 in sys["summary"]的情况下遍历字典时,sys1引用字典中的键,在这种情况下只引用字符串"dll_loaded"

如果你坚持嵌套for循环(不建议),正确的做法是这样的:

for sys in json_data["behavior"]["generic"]:
   for sys1 in sys["summary"]:
      for sys2 in sys["summary"][sys1]:
         print(sys2)

【讨论】:

  • 它成功了,感谢您回答和澄清 sys1 的类型!但是 [0] 代表什么?
  • [0] 表示列表的第一个元素。 json_data["behavior"]["generic"] 是一个包含一个元素的列表(一个元素是字典)。所以要得到字典,我们需要[0]。
  • 如果 dll_loaded 不是列表中的第一个,并且摘要包含以下内容,我将如何遍历它?像这样 "summary": { "file_created": [], "file_recreated": [], "directory_created": [], "dll_loaded": [] }
  • 你能帮我解决其他问题吗?
【解决方案2】:

我认为你只是读错了数据结构。 "summary" 下没有列表,所以你的循环太多了。

for sys in json_data["behavior"]["generic"]:
    for sys1 in sys["summary"].get("dll_loaded", []):
        print(sys1)

【讨论】:

  • 它给了我KeyError: 'dll_loaded' 我已经编辑了这个问题,编辑显示如果我使用这种方法会产生这个错误。
  • 哦,如果字典中的一个或多个键是可选的(可能存在也可能不存在),那么您可以使用dict.get(key, defaultvalue) 我将编辑我的答案来演示。 post about .get()
猜你喜欢
  • 2020-04-09
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多