Не могу разобрать этот файл JSON - PullRequest
0 голосов
/ 07 июня 2018

У меня есть файл json, который выглядит следующим образом:

[
{
  "host": "host1.com",
  "ip": "x.x.x.x",
  "port": 443,
  "tlsVersions": [
    "TLSv1_2"
  ],
  "cipherSuite": {
    "supported": [
      "ECDHE-RSA-AES256-GCM-SHA384"
    ]
  },
  "x509ChainDepth": 2,
  "verifyCertResult": true,
  "verifyHostResult": true,
  "ocspStapled": true,
  "verifyOcspResult": true,
  "certificateChain": [
  {
    "version": 3
  },  {
    "version": 3
  } ]
},

{
  "host": "host2.com",
  "ip": "y.y.y.y",
  "port": 443,
  "tlsVersions": [
    "TLSv1_2"
  ],
  "cipherSuite": {
    "supported": [
      "ECDHE-RSA-AES256-GCM-SHA384"
    ]
  },
  "x509ChainDepth": 2,
  "verifyCertResult": true,
  "verifyHostResult": true,
  "ocspStapled": true,
  "verifyOcspResult": true,
  "certificateChain": [
  {
    "version": 3
  },  {
    "version": 3
  } ]
}

]

Я хочу извлечь host и tlsVersions для каждого хоста и распечатать их в строке, разделенной запятой.Я хочу зациклить на каждом хосте и вывести по одному host с tlsVersions на строку.

Я попытался это сделать:

import json 

with open('result2.json', 'r') as f:
    distros_dict = json.load(f)

for distro in distros_dict:
    print(distro['host']+","+distro['tlsVersions']+'\n')

Я получаю эту ошибку при запуске сценария:

Traceback (most recent call last):
  File "parser.py", line 4, in <module>
    distros_dict = json.load(f)
  File "/usr/lib/python2.7/json/__init__.py", line 291, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

В чем проблема?Библиотека json установлена, и оператор import работает без ошибок.

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

@ user9371654 , есть две основные проблемы, связанные с вашими JSON file и Python code.

  • Содержимое result2.json неправильно отформатировано.

  • Параметры функции print() должны быть разделены ,, поэтому замените все +, используемые для объединения, на , (Если вы все еще предпочитаете ,, тогда вынужно будет преобразовать ваш список в строку, используя str() для поддержки конкатенации).

Скопируйте содержимое JSON в result2.json и отформатируйте его в https://jsonformatter.curiousconcept.com.

enter image description here

result2.json "

enter image description here

Примечание: Обновите файл JSON result2.json следующим содержимым.

[  
   {  
      "host":"host1.com",
      "ip":"x.x.x.x",
      "port":443,
      "tlsVersions":[  
         "TLSv1_2"
      ],
      "cipherSuite":{  
         "supported":[  
            "ECDHE-RSA-AES256-GCM-SHA384"
         ]
      },
      "x509ChainDepth":2,
      "verifyCertResult":true,
      "verifyHostResult":true,
      "ocspStapled":true,
      "verifyOcspResult":true,
      "certificateChain":[  
         {  
            "version":3
         },
         {  
            "version":3
         }
      ]
   },
   {  
      "host":"host2.com",
      "ip":"y.y.y.y",
      "port":443,
      "tlsVersions":[  
         "TLSv1_2"
      ],
      "cipherSuite":{  
         "supported":[  
            "ECDHE-RSA-AES256-GCM-SHA384"
         ]
      },
      "x509ChainDepth":2,
      "verifyCertResult":true,
      "verifyHostResult":true,
      "ocspStapled":true,
      "verifyOcspResult":true,
      "certificateChain":[  
         {  
            "version":3
         },
         {  
            "version":3
         }
      ]
   }
]

Python Code "

Наконец попробуйте следующий код:

import json 

with open('result2.json', 'r') as f:
    distros_dict = json.load(f)

for distro in distros_dict:
    print(distro['host'], "," , distro['tlsVersions'], '\n')

Выход "

host1.com , ['TLSv1_2']

host2.com , ['TLSv1_2']
0 голосов
/ 07 июня 2018

Если это не ответ, предложенный в отношении запятых, попробуйте следующее.

Я думаю, что ожидается, что данные JSON будут содержать объект, где у вас есть массив.

Что у вас есть:

[ 
  { ... }, 
  { ... }
]

Чего я ожидаю:

{
  "Items": [
    { ... }, 
    { ... }
  ]
}
0 голосов
/ 07 июня 2018

Проблема в том, что distro['tlsVersions'] - это массив, а не строка.

В отличие от этого, допустима следующая модификация, хотя она может и не соответствовать действительности:

for distro in distros_dict:
    print(distro['host']+","+distro['tlsVersions'][0]+'\n')

Вышеуказанное производит:

host1.com,TLSv1_2

host2.com,TLSv1_2
0 голосов
/ 07 июня 2018

У вас есть запятые на ваших объектах.Многие JSON-парсеры будут бороться с этим.

Вместо этого:

{
  "foo": "bar",
}

Вам нужно что-то вроде этого:

{
  "foo": "bar"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...