Передача строки Python в полезную нагрузку JSON - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть это в моем коде:

targetTemp = 17
...
payload = "{\n    \"nodes\": [{\n        \"attributes\": {\n            \"targetHeatTemperature\": {\n                \"targetValue\": '+ targetTemp +',\n            }\n        }\n    }]\n}"

Я попробовал несколько вещей, которые нашел в Интернете, но, похоже, ничего не работает. Если я заменю '+ targetTemp +', скажем, на 18, тогда он делает то, что я хочу.

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

Ответы [ 4 ]

0 голосов
/ 04 ноября 2018

Давайте немного укоротим этот код.

payload = "{...\"targetValue\": '+ targetTemp +'...}"

Видишь проблему сейчас? payload ограничено двойными кавычками, поэтому для выхода, добавления и повторного ввода строки необходимо использовать двойные кавычки вместо одинарных кавычек:

payload = "{...\"targetValue\": "+ targetTemp +"...}"

В качестве альтернативы, гораздо более надежным и менее утомительным решением было бы создать payload в виде dict структур Python, содержащих targetTemp в качестве нормального значения и затем после этого сериализовавшего его. с json.dumps:

payload_obj = {
    "nodes": [{
         "attributes": {
             "targetHeatTemperature": {
                 "targetValue": targetTemp,
             }
         }
    }]
}

payload = json.dumps(payload_obj)
0 голосов
/ 04 ноября 2018

Причина, по которой ваша строка не работает, в том, что вы использовали двойные кавычки " для строки вместо одинарных кавычек '. Поскольку формат json требует двойных кавычек, вы должны использовать только двойные кавычки внутри самой строки, а затем использовать одинарные кавычки для обозначения начала / конца строки. (Таким образом, вам не нужно продолжать использовать эти \" без необходимости.
Кроме того, .format() может помочь разместить переменные внутри строк, чтобы упростить их.

Это должно исправить вашу строку json:

targetTemp = 17

payload = '{\n    "nodes": [{\n        "attributes": {\n            "targetHeatTemperature": {\n                "targetValue": {},\n            }\n        }\n    }]\n}'.format(targetTemp)

Тем не менее, использование модуля json значительно облегчает задачу, поскольку позволяет передавать словарь python, который можно преобразовать из / в строку json.

Пример использования пакета json:

import json

targetTemp = 17

payload = {
    "nodes": [{
        "attributes": {
            "targetHeatTemperature": {
                "targetValue": targetTemp
            }
        }
    }]
}

payload_json = json.dumps(payload)  # Convert dict to json string
0 голосов
/ 04 ноября 2018

Ваш payload ужасно сложен, вам не нужно заключать его в кавычки, так как он может рассматриваться как dict, также ваш targetTemp рассматривается как строка, поэтому вы не делаете увидеть фактическое значение.

Для простоты вам может понадобиться Форматирование строки Python .

Это будет делать то, что вы хотите,

import json

targetTemp = 17
payload = {
    "nodes": [{
        "attributes": {
            "targetHeatTemperature": {
                "targetValue": targetTemp
            }
        }
    }]
}

print(json.dumps(payload))

# output,
{"nodes": [{"attributes": {"targetHeatTemperature": {"targetValue": 17}}}]}

Обратите внимание, что вы также можете использовать JSON Validators , чтобы убедиться, что ваш объект json действительно в правильном формате (это то, что я использовал для форматирования предоставленного JSON)

0 голосов
/ 04 ноября 2018

'+ targetTemp +' в крайних двойных кавычках не выполняет конкатенацию строк. Это буквально помещает тот текст.

Вы должны использовать "+ targetTemp +"

Однако создание фактического словаря и использование json.dumps будет менее подвержено ошибкам

...