2016-01-20 3 views
4

Я довольно новичок в Python, так что вот мой вопрос.python - заменить значение неизвестного ключа в json

Я делаю HTTP-запрос для получения некоторых данных JSON, которые были созданы с помощью Javascript. Этот JSON может иметь некоторые значения, такие как "nan", "inf" или "-inf" как строки. Клавиши и глубина этих значений неизвестны. То, что я хочу сделать на стороне Python, - это найти эти значения и заменить их эквивалентом Python float("nan") или float("inf").

Измените что-либо на стороне Javascript, о чем мне сказали.

Я использую следующую функцию, чтобы прочитать ответ HTTP и вернуть JSON эквивалентную

def http_response_to_json(response): 
    response_str = "" 
    CHUNK = 16 * 1024 

    while True: 
     try: 
      chunk = response.read(CHUNK) 
      if not chunk: 
       break 
      response_str += chunk 
     except httplib.IncompleteRead, e: 
      response_str += e.partial 

    return json.loads(response_str) 

Я дочитал от параметра json.loadsobject_hook, но я не уверен, что и как я могу использовать его ,

P.S. Я использую Python 2 еще

Благодарности

ответ

1

После загрузки данных с JSON.loads, вы можете использовать рекурсивную функцию для очистки данных. Вот пример того, как вы можете это сделать.

def cleanup(dirty_data): 
    if isinstance(dirty_data, dict): 
     for key in dirty_data: 
      value = dirty_data[key] 
      dirty_data[key] = cleanup(value) 
     return dirty_data 
    elif isinstance(dirty_data, str): 
     if dirty_data in ["nan", "inf", "-inf"]: 
      return float(dirty_data) 
    else: 
     return dirty_data 

test_object = {"test": 123, "a": {"b": "nan"}} 

print(cleanup(test_object)) 

Этот выход будет: {'a': {'b': nan}, 'test': 123}


EDIT: Вот версия, которая работает с Python 2.

def cleanup(dirty_data): 
    if isinstance(dirty_data, dict): 
     for key in dirty_data: 
      value = dirty_data[key] 
      dirty_data[key] = cleanup(value) 
     return dirty_data 
    elif isinstance(dirty_data, str) or isinstance(dirty_data, unicode): 
     if dirty_data in ["nan", "inf", "-inf"]: 
      return float(dirty_data) 
    else: 
     return dirty_data 

test_object = {"test": 123, "a": {"b": "nan"}} 

print(cleanup(test_object)) 
+0

пришлось изменить 'isinstance (dirty_data, ул)' в 'isinstance (dirty_data, basestring)' для его работы. любая идея почему? – XeniaSis

+0

Когда я проверяю тип с помощью 'type (" test ")' и 'type (json.loads ('{" a ":" 123 "}') [" a "])' они говорят, что это 'str' поэтому я понятия не имею, почему это было бы иначе для вас. – GKBRK

+0

в любом случае! благодаря! Ответ принят :) – XeniaSis

Смежные вопросы