通过隐藏字段传递 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将空字段,空字符串不传递给前端

通过Gson过滤多余的字段

java序列化与反序列化

如果我传递序列化的 json 数据,它会出现在 http 请求中的啥位置?

sql2008存储过程可以直接根据json生成表吗

020-Json结构数据序列化传递