Как получить объект JSON из списка со словарями (одинарные кавычки в двойные кавычки)

#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?

во всяком случае, сценарий сейчас запущен. Спасибо за все входы и поддержку!