JSON字符串中出现意外的空键值

时间:2011-04-03 23:27:47

标签: javascript jquery json

我正在尝试解析嵌入在html文件中的json字符串。 这是简化代码。

<html>
<head>
<script src="./jquery-1.4.4.min.js" type="text/javascript"></script>
<script>
  function parse_json(){
    var jtext = $("#mtxt").text();
    var jdata = jQuery.parseJSON(jtext);
    JSON.parse(JSON.stringify(jdata), function (key, value){ 
            alert("key=" + key + " value=" + value);
            if(key== ""){
                    alert("value in string" + JSON.stringify(value));              
            }
    });
  }
  $(document).ready(function() {
    $("#run").click( function () {
        parse_json();
    }); 
  });
</script>
</head>

<body>
<a id="run" href="#">run</a>
<div id="mtxt">
{"caller": "539293493"}
</div>
</body>
</html>

当我解析它时,除了预期的“调用者”值之外,我得到一个额外的空“key”和“value”。 第一个警报给了我

key= value=[object Object]

第二个警告给了我

value in string{}

发生了什么事?为什么这个额外的条目?

2 个答案:

答案 0 :(得分:3)

好的,你将第二个参数传递给JSON.parse(),这是reviver回调。每the JSON docs,此回调执行“ ...为最终结果的每个级别的每个键和值。每个值将被reviver函数的结果替换。这可用于改革将通用对象转换为伪类的实例,或将日期字符串转换为Date对象。

由于您的reviver回调没有返回任何内容,因此您的对象被不正确地操纵和扭曲。我认为您在使用reviver时没有任何用处。我从来没有在任何地方看到它,我使用JSON.parse很多。

您的代码应如下所示:

function parse_json()
{
    var jtext = $("#mtxt").text(),
        jdata = JSON.parse( $.trim( jtext ) ),
        key,
        value;

    for( key in jdata )
    {
        if( Object.prototype.hasOwnProperty.call( jdata, key ) )
        {
            value = jdata[key];
            //prefer console.log here...
            alert( 'key: ' + key + ', value: ' + value)
        }
    }
}

$( function()
{
    $( '#run' ).click( function()
    {
        parse_json();
    } ); 
} );

演示: http://jsfiddle.net/hjVqf/

答案 1 :(得分:2)

好的,我一直在jsfiddle上使用this愚弄。我注意到你没有做的事情之一就是为reviver函数返回一个值。根据Microsoft JSON.parse docs,该函数的要点是返回将更新DOM对象的value属性的修改(如果需要)版本。现在,它也说:

  

过滤和转换的功能   结果。反序列化的对象   以递归方式遍历,并且   每个都调用reviver函数   后序中对象的成员   (每个物体都会在它之后复活   成员已经复活了。)

好的,所以我认为这里的关键是函数运行两次的原因是因为它运行的是第一个成员(只是"caller": "539293493"),然后是对象本身({"caller": "539293493"}

您会注意到,在我的链接示例中,使用添加的return value;语句,带有空白键的对象是整个对象。