通过隐藏字段传递 JSON 序列化数据
Posted
技术标签:
【中文标题】通过隐藏字段传递 JSON 序列化数据【英文标题】:Passing JSON serialized data via hidden field 【发布时间】:2011-07-07 14:16:37 【问题描述】:在 ASP.NET WebForms 中,我想将任意数据从服务器传递到客户端并再次返回。我正在序列化为 JSON,并且一直在简单地生成在客户端上创建对象的 javascript。我使用 ajax 向服务器发送数据没有问题,但在某些情况下,我还想在回发时将 Javascript 对象数据发送回服务器。所以我想它需要在一个隐藏的领域。
关于这个的几个一般性问题。
1) 在最小化复杂性和优化空间和效率方面,最好的方法是什么?在对此进行研究时,我发现了Protocol Buffers,但似乎没有一个好的 C# 实现。我确实找到了一辆,但它已经有几年历史了,而且自称是越野车,这让我很害怕。
2) 如果我只是传递一个 JSON 字符串,我如何确定将其作为隐藏字段的值包含在内是安全的?有什么理由我可能不想这样做吗?我可以进行 Base64 编码,但这似乎增加了很多开销。什么被认为是最好的或首选的方法?
【问题讨论】:
你为什么不使用会话变量? (只是好奇) 如何从客户端获取数据(在 javascript 中)? @Jamietre:处理程序和 AJAX,与您将其发回的方式相同吗? (ashx/asmx) Ajax 很好,我想可以在页面发布之前触发 ajax 调用,但如果它仍然被发布,这似乎是不必要的服务器之旅.这是我必须拦截的其他东西。 @jamietre:我想在做出判断之前我需要更深入地了解“原始问题”。我可以整天推荐适合您认为合适的方法,但这并不能帮助您解决手头的原始问题。 【参考方案1】:过去,我通常会做以下事情:
-
创建了一个 C# 对象,我可以轻松地将其序列化为 XML(.Net 可以本机执行此操作,并且还有 JSON 序列化程序)。 (实际上我认为 .Net 也可以使用 JSON ......虽然不确定)
获取此对象并通过隐藏字段与客户端共享,或通过 AJAX 请求将其延迟加载到客户端。
然后客户端解析和操作 XML(jQuery 可以做到这一点)并通过 AJAX 或通过 POST 的隐藏字段将其发送回服务器。
最后,我将来自客户端的 XML(或 JSON)反序列化回一个 Object 并从那里使用它。
所以我不确定你想通过编码获得什么,但我认为将对象从 JSON(或 XML)转换为更小的东西的开销对于任何打包/收缩的好处来说都是太多的开销。 (除非您的超高流量站点更关心带宽使用而不是服务器/客户端处理。)
示例
希望这能让您了解如何完成此任务。如果您还有其他问题,请告诉我。
<html>
<head>
</head>
<body>
<input type="button" id="btnObject" value="Show Object" />
<input type="button" id="btnShowHid" value="Show Hidden Input Value" />
<input type="hidden" id="hidInput" value="" />
</body>
</html>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js'></script>
<script type='text/javascript' src='https://github.com/douglascrockford/JSON-js/raw/master/json2.js'></script>
<script>
//Your JSON Object
var myJSONObject = "bindings": [
"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*",
"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*",
"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"
]
;
//jQuery Document Ready Event
$(function()
//Get a reference to your hidden field
var $hidInput = $("#hidInput");
//Use json2.js library to convert the json object to a string
//and assign it to the hidden input's value
//NOTE: ASP.NET hidden input control reduces to a hidden input so you can treat them the same.
$hidInput.val(JSON.stringify(myJSONObject));
//Set up click events to view object and hidden value
$("#btnShowHid").click(function()
alert($hidInput.val());
);
$("#btnObject").click(function()
alert(myJSONObject);
);
);
</script>
【讨论】:
这基本上是我正在使用的架构,您对将数据放入隐藏字段的实际实现细节有什么建议吗?例如。只是将JSON字符串粘贴在那里?这是否需要某种进一步的编码才能安全,例如报价呢?在 JSON 中可以使用但不是字段的任何其他字符?还是base64?还有什么方法?这不一定是 google.com 高效的,但如果有任何替代方案,我宁愿从一个好的实现开始,而不是笨重的实现。有点像我对 ProtocolBuffers 的理解,但没有 C# impl。 您可能希望通过将 json 字符串作为 javascript 变量发送到客户端来避免整个编码问题。 IE。 var x=;然后将服务器端表示保持在会话状态。这为您提供了两全其美的体验。不会篡改表单帖子,也无需对 JSON 进行编码。 JSON.stringify 不是要返回带有双引号的东西吗?我认为这不适用于隐藏字段的值。这真的是我关心的问题。 @jamietre,是的,但它们似乎被转义了双引号。如果您尝试上面的示例,您会发现它成功地将 JSON.stringify 的结果分配给隐藏字段,没有任何问题。如果您在 firebug(firefox 浏览器)中查看 DOM,您还可以毫无问题地看到包含双引号的隐藏字段的实际值。以上是关于通过隐藏字段传递 JSON 序列化数据的主要内容,如果未能解决你的问题,请参考以下文章
SrpingMVC/SpringBoot中restful接口序列化json的时候使用Jackson将空字段,空字符串不传递给前端