Данные JSON распознаются как строковое поле вместо целого числа

Я использую приведенный ниже код Python для управления набором файлов JSON в указанной папке. Я извлекаю nt из данных и хочу создать новую пару ключ-значение. Если бы я напечатал nt на своем экране, я получил бы значения, как показано ниже.

nt 223 
nt 286 
nt 315 

Это выглядит как целые числа для меня. Однако, если я использую инструмент визуализации Kibana для обработки, он говорит об этом (т.е. NXT - это проанализированные строковые поля). Я хочу, чтобы эти значения распознавались как целые числа? Это как-то связано с тем, как я кодирую свой файл json (ensure_ascii=True), или JSON value всегда является строкой?

#Process 'new' events to extract more info from 'Messages'
rootDir = '/home/s_parts'
for dirName, subdirList, fileList in os.walk(rootDir):
     for fname in fileList:
        fname='s_parts/'+fname
        with open(fname, 'r+') as f:
            json_data = json.load(f)
            m = json_data['Msg']
            nt = int(re.findall(r"NXT:\s*([^,m)]*)",m)[0])
            json_data["NXT"] = nt
            f.seek(0)
            json.dump(json_data,f,ensure_ascii=True)

person liv2hak    schedule 07.04.2015    source источник
comment
Можете ли вы открыть файл JSON в текстовом редакторе и скопировать и вставить в свой вопрос соответствующий текст? Я подозреваю, что ваш код работает правильно, и что кибана вам врёт.   -  person Robᵩ    schedule 08.04.2015


Ответы (1)


Похоже, что только json.dump, скорее всего, обрабатывает все как строки. Использование json.loads после того, как оно должно преобразовать его в список или dict, позволит вам использовать значения json как целые числа.

Пример:

x = json.dumps({'1': 2, '3': 4}, ensure_ascii=True, sort_keys=True)
y = json.loads(x)
print(y)
print(y['3']+1)

Выход:

{u'1': 2, u'3': 4}
5

Вы можете преобразовать значение string в int без использования json.loads, однако преобразование его в список или словарь с помощью json.loads намного проще в управлении и извлечении значений. Если вас интересует type ваш json.dump результат, попробуйте сделать:

x = json.dump(json_data,f,ensure_ascii=True)
print(type(x))

https://docs.python.org/3.3/library/json.html

person l'L'l    schedule 07.04.2015
comment
Я не говорю о keys в JSON. Я говорю о value - person liv2hak; 07.04.2015
comment
Значения конвертируются также видимо. Модуль json всегда создает объекты str, а не объекты bytes. Следовательно, fp.write() должен поддерживать ввод str. - это также упоминается на той же странице, на которую есть ссылка в ответе. - person l'L'l; 07.04.2015
comment
В моем файле JSON есть целое число values, распознанное Kibana - person liv2hak; 07.04.2015
comment
Однако это странно. пример, который я использовал, кажется, указывает на то, что даже если json value может показаться, что использует int, он обрабатывает его как строку. ideone.com/yHtcH6 (TypeError: cannot concatenate 'str' and 'int' objects) - person l'L'l; 07.04.2015
comment
Что ж. У меня есть некоторое значение в файле JSON, которое является целым числом. Может, это как-то связано с .metadata? - person liv2hak; 07.04.2015
comment
@liv2hak, после выполнения json.dump я обнаружил, что преобразование его в список или словарь с использованием json.loads работает со значениями, которые обрабатываются как целые числа: ideone.com/cAkXKi - person l'L'l; 07.04.2015