2015-03-03 1 views
-1

Я не испытываю в Python и запутываюсь типами данных.Python Int32 to JSON

Я получаю поле типа Int32 от ROS (http://wiki.ros.org/msg), которые мне нужно сделать, чтобы быть частью JSON, но json.dumps терпит неудачу из-за типа Int32:

json.dumps(angle)
TypeError: data: 72 is not JSON serializable

Casting Int32 в целое число не может тоже, например, при использовании:

angle = int(angle or 0)
TypeError: int() argument must be a string or a number, not 'Int32'

есть ли способ, чтобы изменить тип переменной от пользовательского типа к стандартной? Я не могу изменить источник, где я его получаю.

EDIT: Спасибо другим, что сообщения об ошибке на самом деле говорят «TypeError: data: 72 не является сериализуемым JSON» - показывает, что эта переменная фактически имеет значение «data: 72», а из-за моей неопытности с Python я думал, что часть данных «data:» сообщения об ошибке была получена из ошибки, а не из переменной. Думаю, было бы более очевидно, если бы были использованы котировки:

TypeError: "data: 72" is not JSON serializable

Во всяком случае, это, очевидно, ошибка новобранец. Извиняюсь.

+2

'print repr (angle)' и разместить то, что он говорит –

+0

Как вы его получаете от ROS? –

+0

@JoranBeasley print repr (angle) дал «данные: 72» –

ответ

0

Понял, благодаря @Tui и @ Joran, указывая, что это сообщение от ROS находится в формате «данные: 72», поэтому я превратил его в строку и разделил ее на пробел, а затем повернул номер детали в номер:

angle = str(angle).split(' ')
angle = int(angle[1])

+1

ummm alright ... that doesnt похоже, что это правильно ... но я не знаком с модулем, поэтому я действительно не знаю –

+0

Вы правы, конечно, есть более удобный способ проанализировать это целое число на целочисленную переменную python, но пока это будет (Я не эксперт в Python, и это просто побочный проект) –

+0

из документов В Python сгенерированный файл сообщений Python (например, std_msgs.msg.String) предоставляет почти всю информацию, которая может вам понадобиться в файле .msg.Вы можете изучить '__slots__' и _slot_types и другие поля, чтобы просмотреть информацию о сообщениях. так что, возможно, 'print angle .__ slots__' –

1

Int32 класс, фактическое целое значение хранится в элементе с именем data. Вы можете просто получить доступ к нему с:

angle.data 

Так что в вашем случае это должно быть:

json.dumps(angle.data) 

наводки на будущее: вы всегда можете посмотреть на структуру типа сообщения, используя rosmsg show на терминале. Например

rosmsg show std_msgs/Int32 

Имеет следующий вывод:

int32 data

Таким образом, вы можете увидеть, что сообщение Int32 состоит из одного поля с именем data, который имеет тип int32 (с небольшим «я» так это действительно целое число).