Удалить кавычки для значения, которое имеет целочисленное значение в словаре - PullRequest
0 голосов
/ 02 мая 2019

у меня есть словарь json, я хочу удалить кавычки из целочисленных значений в данных json.

[
  {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": "8.0"
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": "90"
      }
    ]
  }
]

когда я передаю вышеуказанный объект функции (т.е.)

def remove_quote_for_int_values(obj):
    print(expected_output_is_below)
    pass

Выше приведены данные json, которые я хочу получить, как показано ниже

[
  {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 90
      }
    ]
  }
]

Ответы [ 2 ]

1 голос

Прежде всего, это довольно странный объект JSON, если целые значения представлены в виде строки.

Но вы можете сделать следующее:

  1. Если вы знаете, какие поляцелое число:
def remove_quote_for_int_values(obj, fields):
    if isinstance(obj, list):
        return [remove_quote_for_int_values(el, fields) for el in obj]
    elif isinstance(obj, dict):
        result = {}
        for key, value in obj.items():
            if isinstance(value, dict) or isinstance(value, list):
                result[key] = remove_quote_for_int_values(value, fields)
            elif key in fields:
                result[key] = int(value)  # or the desired type (e.g. float)
            else:
                result[key] = value
        return result
    else:
        return obj
Если вы не знаете
def remove_quote_for_int_values(obj):
    if isinstance(obj, list):
        return [remove_quote_for_int_values(el) for el in obj]
    elif isinstance(obj, dict):
        result = {}
        for key, value in obj.items():
            if isinstance(value, dict) or isinstance(value, list):
                result[key] = remove_quote_for_int_values(value)
            else:
                try:
                    value = float(value)  # or any desired type
                except ValueError:  # TypeError when converting to `int`
                    pass
                result[key] = value
        return result
    else:
        return obj

Оба решения должны работать и с вложенными объектами.

0 голосов
/ 02 мая 2019

Это не красиво и, вероятно, есть более простой и эффективный способ сделать это, но это работает:

def remove_quote_for_int_values(obj):
    for book in obj:
        for book_info in book.values():
            for elem in book_info:
                for key, value in elem.items():
                    if value.isdigit():
                        elem[k] = int(value)

Выход:

[{'book': [{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8}, {'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 90}]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...