При преобразовании свойств в JSON он добавил дополнительную обратную косую черту в символ ASCII. Как этого избежать, см. Код ниже.
Входной файл (sample.properties)
property.key.CHOOSE=\u9078\u629e
Код
import json
def convertPropertiesToJson(fileName, outputFileName, sep='=', comment_char='#'):
props = {}
with open(fileName, "r") as f:
for line in f:
l = line.strip()
if l and not l.startswith(comment_char):
innerProps = {}
keyValueList = l.split(sep)
key = keyValueList[0].strip()
keyList = key.split('.')
value = sep.join(keyValueList[1:]).strip()
if keyList[1] not in props:
props[keyList[1]] = {}
innerProps[keyList[2]] = value
props[keyList[1]].update(innerProps)
with open(outputFileName, 'w') as outfile:
json.dump(props, outfile)
convertPropertiesToJson("sample.properties", "sample.json")
Выход: (sample.json)
{"key": {"CHOOSE": "\\u9078\\u629e"}}
Ожидаемый результат:
{"key": {"CHOOSE": "\u9078\u629e"}}
Да, это так. Он предоставил минимальный тестовый пример.
см. это: stackoverflow.com/questions/49315872/…






Проблема, похоже, в том, что вы сохранили символы Юникода, которые представлены как экранированные строки. В какой-то момент вы должны их расшифровать.
Изменение
l = line.strip()
в (для Python 2.x)
l = line.strip().decode('unicode-escape')
в (для Python 3.x)
l = line.strip().encode('ascii').decode('unicode-escape')
дает желаемый результат:
{"key": {"CHOOSE": "\u9078\u629e"}}
это не будет работать в python3, как специально запрошено op.
Python3: .encode('ascii').decode('unicode-escape')
Спасибо за комментарии, я отредактировал свой ответ соответственно для потомков.
Я не знаю решения вашей проблемы, но я выяснил, где возникает проблема.
with open('sample.properties', encoding='utf-8') as f:
for line in f:
print(line)
print(repr(line))
d = {}
d['line'] = line
print(d)
out:
property.key.CHOOSE=\u9078\u629e
'property.key.CHOOSE=\\u9078\\u629e'
{'line': 'property.key.CHOOSE=\\u9078\\u629e'}
Я не знаю, как добавление в словарь добавляет повтора строки.
Проблема в том, что ввод читается как есть, а \u копируется буквально двумя символами. Самое простое исправление, вероятно, следующее:
with open(fileName, "r", encoding='unicode-escape') as f:
Это будет декодировать экранированные символы Unicode.
Этот! Воспользуйтесь этим решением. Это тот ответ, который я хотел дать раньше, но у меня он не сработал, поскольку раньше я ошибочно запускал код с python2 вместо python3.
Я тоже искал ответа. Я задал аналогичный вопрос, просто посмотрите: stackoverflow.com/questions/49315872/…
Вы уверены, что это лишняя обратная косая черта? На первый взгляд, я мог бы предположить, что две люфты необходимы для визуализации буквальной обратной косой черты перед
uв\u. В противном случае\uпросто ускользает отu, что, вероятно, дает простойu.