Разбор Python JSON, проверьте, начинается ли значение с чего-то

Я читаю JSON с URL-адреса и сталкиваюсь с некоторыми проблемами при манипулировании данными.

JSON выглядит следующим образом:

{
  "Id": "1234,
  "something": "{..."
}

Я прочитал JSON с URL-адреса следующим образом, и он отлично работает.

response = urllib.urlopen(url)
data = json.loads(response.read())

Теперь я хочу, чтобы каждый раз, когда значение "something" начинается с '{', добавлять "Id" к списку. Вот что у меня есть:

for x in data:
    if x.get("something").startswith('{'):
        do something...

Я получаю следующую ошибку:

if x.get("something").startswith('{'):  

AttributeError: 'NoneType' object has no attribute 'startswith'

В любом случае я могу заставить это работать или другие предложения о том, как это сделать?

Сообщение об ошибке означает, что «чего-то» нет в вашем JSON. Вы должны сначала проверить, есть ли это, и только потом проверять, с чего он начинается. Возможное решение: x.get("something","").startswith('{')

DYZ 27.03.2018 06:47

@DyZ Спасибо, вот и все.

ashkash 27.03.2018 07:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
918
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ты на правильном пути..

Сначала вам нужно убедиться, что «что-то» существует, иначе ваш код превратит "None", поэтому вы получаете сообщение об ошибке, вы можете попробовать следующее, чтобы убедиться, что это так:

for key, value in data.items():
    if key == "something":
        if value.startswith('{'):
            # do something...

Я виню свою усталость в этом беспорядке, исправлено.

Chris 27.03.2018 06:56

Думаю, вам понадобится только эта часть:

if data.get("something").startswith("{"):

поскольку это dict, вы можете получить значение dict, вызвав ключ с именем dict. Не нужно зацикливаться.

Пока вы зацикливаете, он будет перебирать ключи. Если вы хотите сделать это по-своему, вы можете сделать вот так:

for x, y in data.items():
    if x= = "something" and y.startswith("{"):
          do what you want...
good_items = ["""something""" for k in data if k.startswith('{')]

Вместо «что-то» вы можете поместить вызов метода в функцию, принимающую единственный аргумент (отдельный ключ). Это даст список элементов из данных, которым соответствует условие. Надеюсь, это поможет...

Ответ принят как подходящий

data - это словарь, а «что-то» - это ключ в словаре, который присутствует или отсутствует. Следующий код проверяет наличие ключа (затем он извлекает значение, связанное с кодом, и проверяет, начинается ли значение с символа "{"); или нет (тогда он заменяет значение пустой строкой, которая не начинается с "{"):

if data.get("something","").startswith("{"): ...

Если ключ определенно присутствует, решение еще проще:

if data["something"].startswith("{"): ...

Другие вопросы по теме