Экран из списка Python / Django для разбора JSON с помощью Javascript - PullRequest
0 голосов
/ 15 июня 2019

Знаю, что эти вопросы раздражают, но я действительно застрял, поэтому был бы признателен за помощь.Я пытаюсь отправить список строк во внешний интерфейс и загрузить в объект JavaScript.Соответствующие части приложения Django:

В views.py в функции обработчика:

import json
def home(request):
    test_list = ["(hello world\")"]
    return render(request, 'app/home.html', {"test_list": json.dumps(test_list)})

В home.html:

let parsed = JSON.parse('{{test_list|safe}}');

Я получаю ошибку:

Uncaught SyntaxError: Unexpected token ) in JSON at position 15

Вещи, которые я пробовал:

- running json.dumps directly on each (str) element of the list, not just on the whole list.

- Manually adding a backslash to each of (", ', (, ), [, ] )

- Manually adding two backslashes to each of (", ', (, ), [, ] )

- Not using |safe in the template

То, что сработало, это просто удаление каждого из (", ', (,), [,]). Но я не могуудалите их. Мне нужно, чтобы они избежали.

Вот что Google Chrome сообщает мне, что шаблон разрешается в строке, которая завершается ошибкой:

let parsed = JSON.parse('["(hello world\")"]');

Помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Если вы определите

str = "(hello world\")";

затем JSON.parse(str); выдаст ошибку (Unexpected token ( in JSON at position 0), поскольку нет объекта JSON, начинающегося с ( (см. MDN: полный синтаксис JSON )

Чтобы иметь круглые скобки в вашей строке, вам нужно создать строку, содержащую их, используя двойные кавычки (поскольку JSON принимает только двойные кавычки).

Если заключенные в кавычки двойные символы, вам нужно избегать вложенных двойных кавычек, см. Фрагмент ниже:

// using double quotes outside: need escaping for the inner double quotes to avoid confusion
str = "\"(hello world)\"";
console.log(JSON.parse(str));

// using single quotes outside: no need to escape
str = '"(hello world)"';
console.log(JSON.parse(str));
0 голосов
/ 16 июня 2019

После еще одного целого дня исследований я придумал очень элегантное решение, которое, кажется, работает для всех случаев.

По сути, модуль Python json способен правильно кодировать и декодировать.Поэтому нужно было не связываться с этим, а выяснить, как лучше сохранить его результаты при переходе на внешний интерфейс.

Что я тогда понял, так это то, что определенные экранирующие символы, очевидно, где-то «решаются» где-то(Я все еще знаю, знаю, где и как именно).Чтобы избежать этого, нужно вызвать repr на выходе json.dumps

Итак, рабочий код теперь таков:

import json
def home(request):
    test_list = ["(hello world\")"]
    return render(request, 'app/home.html', {"test_list": repr(json.dumps(test_list))})

и

let parsed = JSON.parse({{test_list|safe}});

Дваизменения включают добавление repr в файл представлений и удаление 'из начала и конца {{test_list | safe}} в шаблоне (это также обрабатывает json в Python)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...