如何在保留缩进的同时将 JSON 数据设置为 cookie?

How do I set JSON data as a cookie while preserving the indentation?

我正在尝试设置一个包含一些 JSON 数据的 cookie,但我还需要保留换行符。我有一种方法来保存它们并呈现它们,这在控制台中运行良好,但是当我实际将代码放入标签中时,它不起作用。

代码如下:

actualData = JSON.stringify(data.replaceAll("\n", "|")).replaceAll("\", "");
document.cookie = `data=${actualData}; path=/;`;

这是控制台中的预期输入和输出:

//input = '[\n    {"content": [\n        {"title": "e"}\n    ]}\n]'
//output = 'data="[|    {"content": [|        {"title": "e"}|    ]}|]"; path=/;'

这是 运行 来自 <script> 标签时的输入和输出:

//input = '[\n    {"content": [\n        {"title": "e"}\n    ]}\n]'
//output = 'data="[\n    {\"co|te|t\": [\n        {\"title\": \"e\"}\n    ]}\n]"'

我不明白同样的代码怎么会返回完全不同的结果。我不知道当 flask 处理它时它如何变得更糟:

[n    {"content": [n        {"title": "e"}n    ]}n]

这与 cookie 的处理方式有关吗?跟我输出的方式有关系吗?

你可以改变你的策略,将 JSON 格式化为字符串(具有所需的缩进),然后 base64 encode 字符串,将生成的值存储到 cookie 中。然后,当您在后续请求中收到 cookie 时,您可以 base64 decode 它。

完整示例如下:

import json
import base64

my_dict = {
    "id": "12345",
    "name": "myname",
    "text": "",
    "list_field": [
        123,
        456,
        "some string"
    ]
}

my_string = json.dumps(my_dict, indent=4)
print(my_string)

my_string_bytes = my_string.encode('ascii')

b64_encoded = base64.b64encode(my_string_bytes)
print(b64_encoded)

b64_decoded = base64.b64decode(b64_encoded)
my_string_decoded = b64_decoded.decode('ascii')
print(my_string_decoded)

if my_string == my_string_decoded:
    print("initial and decoded strings match!")

更简洁的方法,并且不容易出现无意的字符替换