#python #json #list
Вопрос:
В моем скрипте python я хочу выполнить вызов rpc, который принимает массив JSON в качестве аргументов.
rpc.command(JSONarray1, JSONarray2, 0, true)
чтобы получить JSONArrays, я создал списки со словарями в качестве элементов. словари содержат строки в качестве ключей и строк или плавающих/целых чисел в качестве значений.
mylist1 =
[
{
'tixid': 'c1636efe3d85e3bb7e58663cfa976590ed1a9bb6740e7b851cbb34ab63f52ab9',
'vout': 2,
'sequence': 4294967293
},
...,
]
mylist2 =
[
{
'bc1q0eg3madqa38t5usru66nvjzgqkdc7qz9n9qemw': 0.0001
},
...,
]
Когда я передаю mylist вызову rpc, я получаю сообщение об ошибке.
«значение не является строкой, как ожидалось»
Проблема в том, что python использует одинарные кавычки для строк в mylist. Я знаю, что python не волнует, используете ли вы одинарные или двойные кавычки для строки, но вызов rpc, который я использую, делает это…
Я пытался использовать json.dumps(mylist)
. проблема в том, что json.dumps() возвращает строку, которую вызов rpc не может обработать — требуется массив JSON. То же самое касается json.dump()
входа в файл и использования json.load()
Я пытался numpy.array(str_mylist)
. Но повторный вызов rpc не может обработать этот массив — требуется массив JSON.
Есть какие-нибудь предложения, как я могу «заставить» свой скрипт python использовать двойные кавычки для строк в mylist?
Комментарии:
1. Когда вы говорите:
json.dumps() returns a string which the rpc call can't handle
, почему он не может обрабатывать строку? Вы уже сказали, что видите:"value is not a string as expected"
когда вы передаете список.2. json.dumps() возвращает mylist в виде строки. и строка не может быть использована в качестве объекта json вызовом rpc. но вызов rpc может обрабатывать строки внутри объекта json
3. Все значения JSON являются строками; вот что такое JSON: строковое кодирование структур данных.
json.dumps(mylist)
это правильно, если RPC действительно ожидает массив объектов JSON в качестве своего аргумента. Вы смотрели на возвращаемое значениеjson.dumps(mylist)
?4. Можете ли вы привести пример допустимого вызова
rpc.command
? Что-то вродеrpc.command('[{"id": "...", "sequence": 12949, "out": 1, "in": 1.1}]')
того, что, как я ожидаю , вам нужно, еслиsequence
только,out
, иin
также не должны быть строками, а не числами (как предложил пользователь10133842).5. Я проверю, смогу ли я найти конкретную документацию на python для bitcoin rpc.команд…
Ответ №1:
«значение не является строкой, как ожидалось», по-видимому, указывает на нестроковые значения «последовательность», «выход» и «вход». Если ваш вызов rpc ожидает строку, вам может потребоваться задать значения «последовательность», «выход» и » в «в виде строк вместо целого числа или с плавающей точкой. например, «последовательность»:»12949″ вместо «последовательность»: 12949
Комментарии:
1. Я уже пробовал это. даже если я установлю все ключи и значения в виде строк. Я все еще получаю ошибку: «значение не является строкой, как ожидалось». Я предполагаю, что проблема в том (как указано в исходном сообщении), что python устанавливает строки в списках с одинарными кавычками («строка»), а не с двойными кавычками («строка»). И одинарные кавычки в массиве json не отображаются в виде строки для вызова rpc
2. Представление Python своих собственных типов данных не имеет отношения к вопросу о том, какой JSON вам нужен.
json.dumps(mylist)
создаст строковое значение, содержащее строки в двойных кавычках.3. если я использую json.dumps(mylist) Я получаю ошибку: «массив ожидаемого типа, получена строка»…
Ответ №2:
Не уверен, связано ли это, но вы пропускаете запятую после пары ключ-значение 'out': 1
в первом объекте и 'out': 2
во втором, что само по себе приведет к тому, что форматер json взбесится.
Комментарии:
1. мой плохой — вы правы, но этого просто не хватает в примере кода в этом посте. не в моем сценарии. отредактировал исходное сообщение
Ответ №3:
Я мог бы сузить круг поисков и найти ошибку в своем коде, вызвавшую ошибку. Я получил ошибку при вводе значения ключа в mylist1. Я использовал «t i xid» вместо «txid».
Однако меня немного смутило, что ошибка заключалась в том, что «значение не является строкой, как ожидалось». Я бы ожидал, что в этом случае «ключ не является строкой, как ожидалось». так как это диктант с парами ключ:значение. или это отличается в массиве json?
во всяком случае, сценарий сейчас запущен. Спасибо за все входы и поддержку!