【问题标题】:Store JSON string in input field value在输入字段值中存储 JSON 字符串
【发布时间】:2011-05-09 17:44:41
【问题描述】:

如何将 Json 字符串存储在隐藏的输入字段中。好吧,我可以以编程方式完成,但转义有问题。由于我的字符串长度适中,因此很难为所有名称转义 " 字符。请解释它如何以编程方式工作(阶段 1),因为控制台输出看起来相同。

[{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200,"H":500}]test2.html:21 [{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200,"H":500}] test2.html:22 PASSED PHASE 1
jquery.min.js:16Uncaught SyntaxError: Unexpected end of input

谢谢,

bsr.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test</title> 
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>
<body>
        <input type="hidden" id="jsondata" />
        <input type="hidden" id="jsondata2" value="[{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200,"H":500}]"/>


    <script >
            $(document).ready(function() {  

            myItems = [{"X":0,"Y":0,"W":0,"H":500},
                   {"X":358,"Y":62,"W":200,"H":500}]

            console.log(JSON.stringify(myItems));
            $("#jsondata").val(JSON.stringify(myItems));
            console.log(document.getElementById("jsondata").value);
            console.log("PASSED PHASE 1");

            var obj = jQuery.parseJSON($("#jsondata2").val());
            console.log(obj.length);    
            console.log("PASSED PHASE 2");           
        }); 
    </script>
</body>
</html>

编辑:

以下代码有效.. 不确定它是否正确。所以会将一个好的解释标记为答案。谢谢。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test</title> 
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>
<body>
        <input type="hidden" id="jsondata" />
        <input type="hidden" id="jsondata2" value='[{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200,"H":500}]'/>


    <script >
            $(document).ready(function() {  

            myItems = [{"X":0,"Y":0,"W":0,"H":500},
                   {"X":358,"Y":62,"W":200,"H":500}]

            console.log(JSON.stringify(myItems));
            $("#jsondata").val(JSON.stringify(myItems));
            console.log(document.getElementById("jsondata").value);
            console.log("PASSED PHASE 1");

            var obj = jQuery.parseJSON($("#jsondata2").val());
            console.log($("#jsondata2").val()); 
            console.log(obj[0].H);  
            console.log("PASSED PHASE 2");           
        }); 
    </script>
</body>
</html>

【问题讨论】:

  • 您是想将其存储在隐藏字段中以便以后使用,还是想通过表单提交?
  • 我将Json字符串存储在一个隐藏字段中,值是通过服务器端的模板呈现的。在客户端,我将其解析为对象数组并用于进一步表示
  • 好的..以下工作... ,如果有人有好的解释,我会标记它作为答案.. 感谢您的所有帮助
  • 如果您在服务器端渲染它,为什么不直接将其渲染为脚本块并立即使用它而不进行解析?安全考虑?

标签: javascript jquery


【解决方案1】:
<input type="hidden" id="jsondata2" value="[{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200,"H":500}]"/>

不正确。在值字符串中使用单引号 ' 而不是双引号 " 来修复它(或转义 "

<input type="hidden" id="jsondata2" value="[{'X':0,'Y':0,'W':0,'H':500},{'X':358,'Y':62,'W':200,'H':500}]"/>

【讨论】:

  • 只是 SO 着色是查找此类问题的好帮手。
  • 这不是决定性的,请参阅 jQuery API 中的示例 parseJSON var obj = jQuery.parseJSON('{"name":"John"}');警报(obj.name ===“约翰”); .. 这行得通
  • 另外,json.org,到目前为止,我遇到的最常见的错误与对象键有关。在 JSON 中(与 JavaScript 不同),这些必须是双引号字符串。事实上,JSON 中的所有字符串都必须用双引号括起来(JavaScript 也允许单引号;JSON 不允许)。参考:simonwillison.net/2006/Oct/11/json
  • 如果 {'X':0,'Y':0,'W'w':0,'H':500} 来了会怎样..???该值将不正确..
【解决方案2】:

你可以做这样的事情,但它很糟糕,HTML:

<textarea id="jsondata" sytle="display:none"></textarea>

和JS

$(function(){

    var myItems = [{"X":0,"Y":0,"W":0,"H":500}, {"X":358,"Y":62,"W":200,"H":500}]

    $("#jsondata").val(JSON.stringify(myItems));

});

【讨论】:

  • 这是一个很好的解决方案,但它有一个小问题。如果值将包含 &amp;quot; 字符串,则 JSON 将中断,因为 Textarea 会自动解码 HTML 实体,因此它将转换为 "。例如{ x: "a", y: "b&amp;quot;c"} 将转换为 { x: "a", y: "b"c"}
【解决方案3】:

html 标记无效...如果您再次对第一个 html(无效的)运行 html 验证器,您会发现在线错误...

【讨论】:

  • good catch..关于命名空间的第一个错误,因为该文件最初是一个xhtml文件,然后我只是删除了几个部分..第二个错误,关于额外的间距,不确定..需要阅读更多..谢谢
【解决方案4】:

查看有关报价的答案。

原因很简单——当你有这段代码时:

[sometag someattr="qwerty"123":cxzcxz"/]

浏览器理解为:

[sometag someattr="qwerty"/]

最后一部分 (123":cxzcxz") 只是作为垃圾扔掉了。因此,对于您的具体情况,parseJSON 尝试仅使用以下内容:

[{

但你认为它是一个完整的字符串,如:

[{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200," H":500}]

所以最好在服务器端输入隐藏字段的值之前对 json 进行编码。

【讨论】:

    【解决方案5】:

    试试下面的代码,看起来你有一个数组而不是我的对象。

     myItems = { data : [{"X":0,"Y":0,"W":0,"H":500},
                         {"X":358,"Y":62,"W":200,"H":500}] };
    

    【讨论】:

    • 我认为您错过了问题的重点。他在问为什么当数据通过 javascript 注入到字段时它可以工作,但是当数据在字段的 value 属性中时它不会。
    • @Gazler :不是我的理解。我看到stringify() 有效,而parseJSON() 无效。 parseJSON() 失败,因为它不是有效的 JSON。我给出了有效的 JSON:已解决。
    • @Hogan,如果您运行代码,您会发现这两种方法使用不同的数据。 stringify() 和 parseJSON() 都可以工作。
    • 霍根我按照你说的改变了数据,输入到相应的 ,仍然同样的错误。因此,它可能与转义字符“
    • value="{"data":[{"X":0,"Y":0,"W":0,"H":500},{"X":358,"Y":62,"W":200,"H":500}]}" 是错误的,因为@rachet 指出您不能在由" 分隔的属性中包含"。您必须将其与"'“混合”。
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多