a.json файл:
{
"a": "b",
"key": "graph: \"color\" = 'black' AND \"api\" = 'demo-application-v1' nodes",
"c": "d"
}
следующий код, который я пробовал:
string_to_be_replace = "abcd"
string_to = "graph: \"color\" = 'black' AND \"api\" = 'demo-application-v1' nodes"
string_to_be_identified = "\"color\" = \'black\' AND \"api\" = \'demo-application-v1\'"
string_to_be_identified1 = '"color" = \'black\' AND "api" = \'demo-application-v1\''
print string_to_be_identified
print string_to_be_identified1
print string_to.replace(string_to_be_identified1,string_to_be_replace)
print string.replace(string_to, string_to_be_identified,string_to_be_replace)
выход:
"color" = 'black' AND "api" = 'demo-application-v1' "color" = 'black' AND "api" = 'demo-application-v1' graph: abcd nodes graph: abcd nodes
Это работает нормально и заменяет строку, как ожидалось, но
это не так, когда я пробовал следующие подходы
Подход 1:
Открыть файл в режиме чтения,
получить построчно и заменить строку
with open(path + '/a.json', 'r') as file: read_lines = file.readlines() for line in read_lines: print line.replace(string_to_be_identified,string_to_be_replace) file.close()
выход:
{ "a": "b", "key": "graph: \"color\" = 'black' AND \"api\" ='demo-application-v1' node", "c": "d" }
Подход 2:
Открыть файл в режиме чтения,
Поскольку файл a.json содержит данные JSON, загрузите файл JSON, преобразуйте объект JSON в строку JSON и затем замените его.
Код:
with open(path + '/a.json', 'r') as file:
loadedJson = json.load(file)
print "z: " + str(loadedJson).replace(string_to_be_identified, string_to_be_replace)
file.close()
выход:
z: {u'a': u'b', u'c': u'd', u'key': u'graph: "color" = 'black' AND "api" = 'demo-application-v1' node'}
Подход 3:
Я предполагаю, что символ Unicode в строке JSON может создавать проблему, поэтому преобразовал строку Unicode в обычную строку, а затем попытался заменить строку
код:
def byteify(input):
if isinstance(input, dict):
return {byteify(key): byteify(value)
for key, value in input.iteritems()}
elif isinstance(input, list):
return [byteify(element) for element in input]
elif isinstance(input, unicode):
return input.encode('utf-8')
else:
return input
with open(path + '/a.json', 'r') as file:
loadedJson = json.load(file)
js = byteify(loadedJson)
print "a: " + str(js).replace(string_to_be_identified, string_to_be_replace)
выход:
a: {'a': 'b', 'c': 'd', 'key': 'graph: "color" = 'black' AND "api" = 'demo-application-v1' node'}
@zwer, Json слишком велик, чтобы перейти к конкретным иерархиям, и хуже всего то, что String - это поле в сложном объекте, которое присутствует в массиве неоднородных сложных объектов. Теперь эта строка может присутствовать как часть другого объекта в будущем, и если она не присутствует в логике синтаксического анализа, мы можем ее пропустить, поэтому подумайте о решении замены строки, которое будет работать независимо от глубины резкости в json.






Хотя я, конечно, не рекомендую какой-либо контекстный поиск и замену в иерархической структуре, такой как JSON, ваша основная проблема заключается в том, что строка, которую вы ищете в своем файле JSON, не содержит кавычек (буквальные символы \), поэтому вам нужно учтите и их, если вы хотите выполнять поиск по обычному тексту. Вы можете использовать либо сырые строки, либо самостоятельно добавить обратную косую черту, например:
str_search = r"graph: \"color\" = 'black' AND \"api\" = 'demo-application-v1'"
# or, if you prefer to manually write down the string instead of declaring it 'raw':
# str_search = "graph: \\\"color\\\" = 'black' AND \\\"api\\\" = 'demo-application-v1'"
str_replace = "abcd"
with open("/path/to/your.json", "r") as f:
for line in f:
print(line.replace(str_search, str_replace))
Что для вашего JSON даст:
{
"a": "b",
"key": "abcd nodes",
"c": "d"
}(Дополнительные новые строки добавлены print).
Я не знал о сырой струне, спасибо! @Zwer, это помогло :)
дополнительная информация о необработанной строке: stackoverflow.com/questions/2081640/…
Дополнительная информация: Операция с необработанной строкой отличается от обычной конкатенации строк, цвет - это переменная, определяемая пользователем: например, r"AND color = '" + color + "' AND \"api\" тогда лучше тебе делать r"AND color = '" + color + r"' AND \"api\"
Какая-либо конкретная причина, по которой вы пытаетесь выполнить простой поиск и замену иерархических данных, таких как JSON? Почему бы вам не проанализировать JSON, правильно заменить то, что вам нужно, а затем снова сериализовать его в JSON?