Как изменить текст в JSON, в котором есть кавычки? - PullRequest
1 голос
/ 15 февраля 2020

Следующий код работает на python без каких-либо проблем. Он открывает файл JSON и заменяет все bananas на apples:

import json

replacements = "banana" : "apple"

with open(mycodepath, 'r') as file:
    data = file.read()
for old, new in replacements.items():
    data = data.replace(old, new)

Однако я хочу заменить "ArmReoriented", "visible": true на "ArmReoriented", "visible": false,

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

replacements = """ArmReoriented", "visible": true""" : """ArmReoriented", "visible": false,"""

Как заменить текст, содержащий кавычки, на JSON, используя Python?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2020

Попробуйте переключиться на одинарные кавычки в вашем замене dict:

replacements = {'"ArmReoriented", "visible": true': '"ArmReoriented", "visible": false,'}

data = 'asd asd asd "ArmReoriented", "visible": true asd asd'
for old, new in replacements.items():
    data = data.replace(old, new)
print(data)

Вы также можете избежать двойных кавычек как из ключа, так и из значения в вашем замене:

replacements = {"\"ArmReoriented\", \"visible\": true": "\"ArmReoriented\", \"visible\": false,"}
0 голосов
/ 15 февраля 2020

Если мы знаем, к какому ключу прикреплено значение ArmReoriented, мы можем сделать это правильным способом, обрабатывая ваш контент структурированные данные , а не в виде строки:

import json, copy

def hideReorientedArm(obj):
    if isinstance(obj, dict):
        if obj.get("LastEvent") == "ArmReoriented" and obj.get("visible") is True:
            obj["visible"] = False
    return obj

def walk(obj, updateFn):
    if isinstance(obj, list):
        obj = [walk(elem, updateFn) for elem in obj]
    elif isinstance(obj, dict):
        obj = {k: walk(v, updateFn) for k, v in obj.items()}
    return updateFn(obj)

with open(mycodepath, 'r') as file:
    data = json.load(file)
    data = walk(data, hideReorientedArm)

См. Это в https://ideone.com/Zr6546


Даже если вы не знаете имя специфика c ключ с этим значением, вы все равно можете искать их все, если это необходимо по какой-то причине, заменив приведенное выше более короткое определение hideReorientedArm на что-то более похожее на следующее:

def hideReorientedArm(obj):
    if isinstance(obj, dict):
        if obj.get("visible") is True:
            foundArmReoriented = False
            for (k,v) in obj.items():
                if v == "ArmReoriented":
                    foundArmReoriented = True
                    break
            if foundArmReoriented:
                obj["visible"] = False
    return obj

... см. эту версию работающей в https://ideone.com/z34Mx1

0 голосов
/ 15 февраля 2020

Использование "" "в основном комментарий или do c -string и не будет работать.

Поместите двойную кавычку между строкой одинарной кавычки, как показано ниже.

replacements = {'"ArmReoriented", "visible": true' : '"ArmReoriented", "visible": false'}
...