简体   繁体   中英

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

I'm trying to set a cookie containing some JSON data, but I also need to preserve line breaks. I've got a way of keeping them and rendering them which works fine in the console but when I actually put the code in a tag, it doesn't work.

Here's the code:

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

Here's the expected input and output, which is in the console:

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

Here's the input and output when run from a <script> tag:

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

I don't understand how the same code is returning a completely different result. I don't know how it gets even worse when flask handles it:

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

Is it something to do with how cookies are handled? Is it something to do with how I'm outputting it?

you can change your tactic and format the JSON to a string (with the required indentation), then base64 encode the string, store the produced value to the cookie. Then when you receive back the cookie in a subsequent request, you can base64 decode it.

Full example below:

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!")

much cleaner approach, and not prone to unintentional character replacements

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM