解决使用 Jinja2 插入 JSON 数据时出现的乱码

本文介绍在使用Flask框架结合Jinja2模板引擎时遇到的JSON数据乱码问题及解决方案。通过添加tojson过滤器正确显示JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在用 flask 搭建一个网页时,我想要在模版中传入一个 JSON 的字符串,结果发现通过 Jinja2 传入的 JSON 数据变成了了乱码。其中的引号和空格都变为了 &#xx; 的形式:

var humidityJSON = {{ humidityJSON }};

传入之后:

var humidityJSON = [{'Time': '08/18/2018 09:25:45', 'Humidity': 25}...

在一番检索后,我发现原来是因为 Jinja2 对 JavaScipt 的保护措施,导致不能很好地传入 JSON 数据。它会将其中的一些符号变为 HTML 中的编码。

这样直接就导致了生成的网页渲染失败。我尝试了一些方法,比如去掉传入字符串中的空格,但是其中的引号也同样会造成乱码,所以这种方法并不可行。

尝试了半个上午无解之后,我去 Stack Overflow 上面搜索了这样一个问题,终于找到了解决方法:

Stack Overflow - sending data as JSON object from Python to Javascript with Jinja

使用 tojson 设置

其实只需要在传入的数据后加上 tojson 的设置就能够完成传递 JSON 数据了。

var humidityJSON = {{ humidityJSON|tojson }};

Stack Overflow 网站上使用的方法是 data|tojson|safe 但是其实在新版本的 Jinja2 之后就不需要 safe 选项了

var humidityJSON = [{"Humidity": 25, "Time": "08/18/2018 09:25:45"}...

成功解决,果然 Stack Overflow 是个解决问题的好地方。

转载于:https://my.oschina.net/u/3729927/blog/1930369

/// <summary> /// 根据数据生成PDF /// </summary> /// <returns></returns> [HttpPost] public JsonResult GeneratePdf(CarCrashPdfInfo carCrashPdfInfo) { var data = new { Status = true, Msg = "" }; try { CrashInfo crashInfo = JsonConvert.DeserializeObject<CrashInfo>(carCrashPdfInfo.loadedJson); #region json数据之中加入事件概述信息 if (crashInfo != null && crashInfo.status) { if (crashInfo.events != null && crashInfo.events.Count > 0) { List<EventOverview> eOverList = new List<EventOverview>(); foreach (EdrEvents item in crashInfo.events) { eOverList.Add(new EventOverview() { No = item.EventNo, Name = "事件" + item.EventNo, Type = item.type, EventTime = GetAccidentTime(item), EventType = GetAccidentEventType(item), EventImgName = GetEventTypeImgName(item), Content = GetEventContent(item) }); ; } List<EventOverview> sortList = eOverList.OrderByDescending(o => o.No).ToList(); crashInfo.eventOverview = sortList; } } #endregion #region json数据之中加入事件总览-图片次数 if (crashInfo != null && crashInfo.status) { if (crashInfo.events != null && crashInfo.events.Count > 0) { EventPandect eventPandects = new EventPandect(); eventPandects.Content = GetEventPandect(crashInfo.events); crashInfo.eventPandect = eventPandects; } } #endregion //string currentDirectory = Directory.GetCurrentDirectory(); string currentDirectory = "C:\\Users\\Admin\\Desktop\\AndroidWeb\\Yk.TdEdr.Core"; string htmlFilePath = Path.Combine(currentDirectory, "File", "htmltopdf.html"); string htmlContent = System.IO.File.ReadAllText(htmlFilePath); CarCrashInfoModel model = carCrashPdfInfo.model; htmlContent = htmlContent .Replace("[[var:vinCodeRead]]", model.vinCodeRead) .Replace("[[var:vinCodeInput]]", model.vinCodeInput) .Replace("[[var:plateNumber]]", model.plateNum
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值