Преобразование JSON String в словарь с использованием оболочки без escape

У меня были аналогичные проблемы с Xcode 7.3:

Не удалось открыть файл «FirstSteps.temp_caseinsensitive_rename», потому что у вас нет разрешения на просмотр.

В моем случае решение заключалось в том, чтобы изменить имя продукта в разделе «Упаковка» настроек сборки:

с «FirstSteps.temp_caseinsensitive_rename» на «FirstSteps»

снимок экрана

-1
задан lenik 13 July 2018 в 15:44
поделиться

4 ответа

Я нашел модуль python 2, который может обрабатывать такие случаи.

Предположим, что у вас есть эта строка:

>>> str = '{foo: bar, id: 23}'

Затем вы можете использовать yaml следующим образом:

>>> import yaml
>>> dict = yaml.load(str)
>>> dict
{'foo': 'bar', 'id': 23}

>>> dict['foo']
'bar'

Теперь у вас есть то, что вам нужно.

Дополнительная информация (а также поддержка python 3 и т. д.) можно найти здесь: https: // pyyaml. орг / вики / PyYAMLDocumentation

1
ответ дан imans77 17 August 2018 в 12:30
поделиться
  • 1
    Это кажется идеальным, но как-то он работает только в среде разработки Python. Я буду продолжать в понедельник. Отчитается. – valenzio 13 July 2018 в 18:55
  • 2
    на самом деле я тестировал снаружи и работал отлично. Я дал этому str как первый вход, который является sys.argv[1] и с приведенным выше кодом, вы получите ответ, который вы хотите :) – imans77 13 July 2018 в 20:13
  • 3
    Хорошо, я понял это. 1) Вам понадобится пробел после :, иначе вы получите ошибку. Любой способ избежать этого? 2) Мне нужно вызвать yaml.load дважды dict_in=yaml.load(yaml.load(sys.argv[1])) по какой-то странной причине. Первый раз он преобразует его в строку, второй раз в словарь – valenzio 16 July 2018 в 08:13
  • 4
    1) На самом деле это одна из немногих известных проблем, которые люди спорили. Когда я работал с этим, я написал сценарий для проверки каждого двоеточия в строке и добавления пробела после этого, если этого не было, и это решило мою проблему. Некоторые люди тоже пытались изменить основной модуль, например, тот, который предложил здесь и , этот - это еще одна ссылка, сообщающая об этой проблеме. – imans77 16 July 2018 в 13:24
  • 5
    2) Как такое могло случиться? Я имею в виду, каков первоначальный тип sys.argv[1], который после yaml.load превращается в строку ?! Это уже строка. Что вы получаете после первого yaml.load? Та же строка, которая была передана ему? – imans77 16 July 2018 в 13:25

Не уверен, что то, что вы проходите, важно, но вы можете передать следующее и получить желаемый результат:

"{\"key1\":\"value1\", \"key2\":\"value2\"}"

или

'{"key1":"value1", "key2":"value2"}'

Вот код и вывод:

$cat json_convert.py 
import json
import sys
dict_in = json.loads(sys.argv[1])
print (dict_in)
$ python json_convert.py '{"key1":"value1", "key2":"value2"}'
{'key1': 'value1', 'key2': 'value2'}

То, что вы передаете """{"key1":"value1", "key2":"value2"}""", переводится в "" + "{" + key1 + ":" + value1 + ", " + + key2 + ":" + value2 + "}" + "", если вы спрашиваете bash, если вы вызывали функцию с этим в качестве аргумента из самого python, вы бы получить желаемые результаты.

Так что действительно идет вниз к тому, из чего вы его вызываете.

Если вам все еще нравятся кавычки, пройдите """{"'"key1"'":"'"value1"'", "'"key2"'":"'"value2"'"}""", чтобы получить желаемый результат:)

1
ответ дан Dusan Gligoric 17 August 2018 в 12:30
поделиться
  • 1
    Это работает, но вы используете escape-символы, которых я пытаюсь избежать. – valenzio 13 July 2018 в 15:46
  • 2
    Он не во второй версии. – Daniel Roseman 13 July 2018 в 15:47
  • 3
    – Dusan Gligoric 13 July 2018 в 15:48
  • 4
    о, жаль, что не видел этого, но это тоже не работает, тот же результат, что и с тройными кавычками. – valenzio 13 July 2018 в 15:52
  • 5
    Конечно, @valenzio, проверьте редактирование, пожалуйста :) – Dusan Gligoric 13 July 2018 в 16:02

используйте либо:

$ your_other_program | python main.py

, чтобы отправить выход другой программы на python, либо использовать base64.b64encode(json.dumps(blah)), и вы получите красивый код, например

. 'eyJtQXV0b21hdGljVGVzdExpc3QiOiBbeyJtWSI6IDguMTE0MTA1LCAibU5hbWUiOiAiYWNjZWxlcmF0b3JFbnRpdHkiLCAibVRlc3RTdGF0dXMiOiB0cnVlLCAibVgiOiAzLjgwNDM1MTgsICJtWiI6IC0zLjM4OTU3MjF9LCB7Im1OYW1lIjogImJhcm9tZXRlckVudGl0eSIsICJtVmFsdWUiOiAwLCAibVRlc3RTdGF0dXMiOiBmYWxzZX1dLCAibUF1dG9tYXRpY1Rlc3RDb21wbGV0ZWQiOiB0cnVlfQ =='

, чтобы поместить в командной строке, а затем декодировать его обратно из base64 в формате JSON

Или, еще лучше, используйте:

$ your_other_program >output_file.tmp
$ python main.py < output_file.tmp
$ rm output_file.tmp
0
ответ дан lenik 17 August 2018 в 12:30
поделиться
  • 1
    интересно, я попробую в понедельник, так как я не отвечаю за другую_программу (это не в python) – valenzio 13 July 2018 в 15:55
  • 2
    @valenzio, почему вы не используете файл? – lenik 13 July 2018 в 15:55
  • 3
    Строка Json сохраняется в отдельной базе данных, поэтому было бы неплохо, если бы я мог просто использовать эту строку. В худшем случае мой сервисный уровень может создать файл с информацией. – valenzio 13 July 2018 в 16:03

Итак, вот что такое мой тестовый скрипт:

print("original sys.argv output\n" + (sys.argv[1]))
string_temp=(yaml.load(sys.argv[1]))
print ("first transformation\n" +string_temp)
string_temp=string_temp.replace(":",": ")

dict_in=yaml.load(string_temp)
print("This is the dictionary")
print(dict_in)

Это то, что я набираю в консоль

python test_script.py """{foo:bar, id:23}"""

И это вывод

original sys.argv output
"{foo:bar, id:23}"
first transformation
{foo:bar, id:23}
This is the dictionary
{'foo': 'bar', 'id': 23}

Это работает только в том случае, если я использую трипсовые кавычки ("" "). Если я использую (") или (') для определения входной строки, я получаю сообщение об ошибке.

В качестве альтернативы можно удалить (") из sys.argv[1]

print("original sys.argv output\n" + (sys.argv[1]))
string_temp=(sys.argv[1])[1:-1]
print ("first transformation\n" +string_temp)
string_temp=string_temp.replace(":",": ")

dict_in=yaml.load(string_temp)
print("This is the dictionary")
print(dict_in)
0
ответ дан valenzio 17 August 2018 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: