Неожиданное пустое значение ключа в строке JSON - PullRequest
2 голосов
/ 04 апреля 2011

Я пытаюсь проанализировать строку json, встроенную в мой HTML-файл.Вот сокращенный код.

<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=[object Object]

Второе предупреждение дает мне

value in string{}

Что происходит?Почему эта дополнительная запись?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2011

Хорошо, вы передаете второй параметр в JSON.parse (), который является обратным вызовом reviver. Согласно документам JSON , этот обратный вызов выполняется " ... для каждого ключа и значения на каждом уровне конечного результата. Каждое значение будет заменено результатом функции 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/

2 голосов
/ 04 апреля 2011

Хорошо, я дурачился с этим на jsfiddle. Одна из вещей, которые я заметил, что вы не делали, это возвращение значения для функции reviver. Согласно документам Microsoft JSON.parse , функция должна возвращать модифицированную (при необходимости) версию свойства value, которая будет обновлять объект DOM. Теперь также говорится, что:

Функция, которая фильтрует и преобразовывает результаты, достижения. Десериализованный объект пройдено рекурсивно, и функция оживления вызывается для каждого член объекта в пост-заказе (каждый объект возрождается после всех его члены были возрождены).

Хорошо, я думаю, что ключевой момент здесь в том, что функция запускается дважды, потому что она выполняется для первого члена (просто "caller": "539293493") и затем для самого объекта ({"caller": "539293493"}).

Вы заметите, что в моем связанном примере с добавленным оператором return value; объект с пустым ключом является целым объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...