строка, создаваемая ошибками pythons json.dumps () при загрузке с помощью javascripts JSON.parse () в двойных кавычках

1

У меня есть следующая строка с двумя экранированными двойными кавычками:

var morgen = '{"a": [{"title": "Fotoausstellung \"Berlin, Berlin\""]}';

Насколько я знаю, это действительно JSON. Тем не менее выполнение JSON.parse(morgen) не выполняется

SyntaxError: JSON.parse: expected ',' or '}' after property value in object at line 1 column 36 of the JSON data

Строка была создана методом json.dumps().

  • 0
    Помимо проблемы с обратной косой чертой, это недопустимый JSON: в нем отсутствует символ } на внутреннем объекте.
Теги:

2 ответа

1
Лучший ответ

Как упоминает Pointy, вы должны просто вставлять этот JSON как объект в свой исходный код JavaScript, а не как строку, которая должна быть проанализирована.

Тем не менее, чтобы напечатать JSON с escape-кодами, подходящими для использования в качестве строки JavaScript, вы можете сказать Python, чтобы закодировать его с кодеком "unicode-literal". Тем не менее, это создаст объект bytes, поэтому вам нужно его декодировать, чтобы создать текстовую строку. Вы можете использовать кодек ASCII для этого. Например,

import json

# The problem JSON using Python raw string syntax
s = r'{"a": [{"title": "Fotoausstellung \"Berlin, Berlin\""}]}'

# Convert the JSON string to a Python object
d = json.loads(s)
print(d)

# Convert back to JSON, with escape codes.
json_bytes = json.dumps(d).encode('unicode-escape')
print(json_bytes)

# Convert the bytes to text
print(json_bytes.decode('ascii'))    

выход

{'a': [{'title': 'Fotoausstellung "Berlin, Berlin"'}]}
b'{"a": [{"title": "Fotoausstellung \\\\"Berlin, Berlin\\\\""}]}'
{"a": [{"title": "Fotoausstellung \\"Berlin, Berlin\\""}]}
1

Вам придется удвоить символы обратной косой черты:

var morgen = '{"a": [{"title": "Fotoausstellung \\"Berlin, Berlin\\""]}';

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

Если все, что вам нужно, это структура как объект JavaScript, вы просто выполните следующее:

var morgen = {"a": [{"title": "Fotoausstellung \"Berlin, Berlin\""]};
  • 0
    Я сузил это до той части JSON. Все это динамически генерируется и намного больше. Так сколько уровней побега мне нужно? В каких случаях отключается JavaScript?
  • 0
    Вы не опубликовали код Python, который выводит содержимое. Если ваш код Python создает JavaScript, просто поместите JSON непосредственно в код: синтаксис JSON является подмножеством буквального синтаксиса объекта JavaScript; это в принципе JavaScript код. Таким образом, он может быть использован напрямую.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню