Невозможно индексировать разобранную строку JSON из бэкенда
Мой фронтенд должен принимать строку JSON из бэкенда и использовать ее, но когда я пытаюсь проиндексировать ее после использования JSON.parse()
, он возвращает undefined
. Я проверил, и он также не находится внутри массива; это просто литерал объекта JSON.
Если кто-то из вас не знаком с TypeScript, восклицательные знаки - это фишка TS, и их удаление не меняет результатов, которые я получаю.
Вот что показывает мне консоль:
console.log(document.getElementById('guestUserCredentials')!.textContent!)
"{\"EMAIL\": \"guest_user@foo.com\", \"PASSWORD\": \"foobar\"}"
console.log(JSON.parse(document.getElementById('guestUserCredentials')!.textContent!))
{"EMAIL": "guest_user@foo.com", "PASSWORD": "foobar"}
console.log(JSON.parse(document.getElementById('guestUserCredentials')!.textContent!)["EMAIL"])
undefined
Возможно, это как-то связано с тем, как мой бэкенд Django кодирует строку JSON? Как мне проверить это и исправить, если это так? Я передаю ее фронтенду React/TS следующим образом:
settings.py
...
GUEST_USER_CREDENTIALS = {
'EMAIL': os.environ.get('GUEST_EMAIL'),
'PASSWORD': os.environ.get('GUEST_PASSWORD'),
}
...
views.py
import json
from django.conf import settings
from django.shortcuts import render
def index(request, *args, **kwargs):
print(settings.GUEST_USER_CREDENTIALS)
print(json.dumps(settings.GUEST_USER_CREDENTIALS))
return render(request, 'index.html', context={
'GUEST_USER_CREDENTIALS': json.dumps(settings.GUEST_USER_CREDENTIALS),
})
index.html
<!DOCTYPE html>
{% load static %}
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='icon' href='{% static "frontend/favicon.ico" %}' type='image/x-icon' />
<title>foo</title>
</head>
<body>
<div id='root'>
<!-- React goes here. -->
</div>
</body>
{{ GUEST_USER_CREDENTIALS|json_script:"guestUserCredentials" }}
<script src='{% static "frontend/index.bundle.js" %}'></script>
</html>
Возможно, это связано с тем, как тег шаблона json_script
экранирует определенные символы в строке JSON? Я не могу найти в документации ничего о том, как это может повлиять на вывод.
Вот вывод двух команд print()
в views.py
:
print(settings.GUEST_USER_CREDENTIALS)
{'EMAIL': 'guest_user@foo.com', 'PASSWORD': 'foobar'}
print(json.dumps(settings.GUEST_USER_CREDENTIALS))
{"EMAIL": "guest_user@foo.com", "PASSWORD": "foobar"}
Я даже попробовал разобрать строку JSON с destr
вместо JSON.parse()
и результат все тот же. Это было так разочаровывающе.
Я попробовал обернуть вывод JSON.parse()
в другой вызов JSON.parse()
, и мне удалось проиндексировать полученный объект так, как я хотел.
Я не уверен, что полностью понимаю, что происходит, но я полагаю, что не было необходимости выполнять json.dumps()
в моем views.py
файле, поскольку settings.GUEST_USER_CREDENTIALS
уже был JSON.
Удаление json.dumps()
из views.py
и добавление settings.GUEST_USER_CREDENTIALS
к контексту как есть устраняет необходимость двух вызовов JSON.parse()
во фронтенде, и теперь все работает как ожидалось.