Вопрос по javascript, reviver-function, json, debugging – Использование JSON.parse reviver для запутывания полей

4

Я пытаюсь использовать функцию восстановления с помощью JSON.parse.

Я хочу сделать некоторые поля пустыми.

Если я сделаю это:

var json_data = JSON.parse(j, function(key, value) {
  if (key == "name") {        
    return value;
  } else {
    return null;    
  }    
});

Весь объект json_data обнуляется. Фактически, что бы я ни делал, это определяет значение json_object.

Интересно, что это работает как ожидалось:

var json_data = JSON.parse(j, function(key, value) {
  if (key == "name") {        
    return "name";
  } else {
    return value;    
  }    
});

Свойство «имя» теперь имеет значение «имя».

JSON в вопросе:

var j = '{"uuid":"62cfb2ec-9e43-11e1-abf2-70cd60fffe0e","count":1,"name":"Marvin","date":"2012-05-13T14:06:45+10:00"}';

Обновит

Я только что понял, что обратное тому, что я хочу сделать, также работает, поэтому я могу обнулить поле имени:

var json_data = JSON.parse(j, function(key, value) {
  if (key == "name") {        
    return null;
  } else {
    return value;    
  }    
});
Кроме того, что вы видите, если вы console.log - или оповещение - значение в функции reviver? Я проверил API и пока твой код выглядит хорошо ... jmort253
+ 1 Интересный вопрос jmort253
Можете ли вы также опубликовать JSON? jmort253

Ваш Ответ

2   ответа
4

что последний вызов сделан для функции, где ключ является пустой строкой, а значение - объектом верхнего уровня:

> JSON.parse('{"hello": "world"}', function(k, v) { console.log(arguments); return v; })
["hello", "world"]
["", Object]

Так что вы можете использовать:

var json_data = JSON.parse(j, function(key, value) {
  if (key == "name" || key === "") {        
    return value;
  } else {
    return null;    
  }    
});

Теперь, так как"" действительно является действительным ключом JSON, чтобы быть на 100% правильным, лучше использовать что-то вроде:

var json_data;
JSON.parse(j, function(key, value) {
  if (key == "name") {        
    return value;
  } else if (key === "") {
    json_data = value;
    return null;
  } else {
    return null;    
  }    
});

Но это может быть немного параноиком;)

Прости за это! Случайно отредактировал неправильный ответ. Corbin
Черт ... Мне нравится это редактирование. Это выглядело так, как будто я цитировал источники и прочее;) David Wolever
@ David - Ваш пример консоли действительно помогает! Я думаю, что происходит, я думаю. Один из возвращаемых массивов имеет ключ "", поэтому, если он не проверен, если я правильно понимаю, весь объект становится нулевым? jmort253
Ага. Как и в случае @Corbin, при последнем обращении к reviver ключ имеет значение"" и значение, установленное для объекта JSON верхнего уровня (в моем примере,{hello: "world"}). Значение, возвращаемое этим вызовом, является значением, возвращаемымJSON.parse, так что еслиnull возвращается отсюда (как это было бы в коде ОП), JSON.parse` также вернетnull. David Wolever
4

так как весь объект включается в объекты, передаваемые реверирующему.

Когда передается весь объект, ключ равен нулю.

http: //jsfiddle.net/sGYGM/7

var j = '{"uuid":"62cfb2ec-9e43-11e1-abf2-70cd60fffe0e","count":1,"name":"Marvin","date":"2012-05-13T14:06:45+10:00"}';

var json_data = JSON.parse(j, function(k, v) {
    if (k === "" || k == "name") {
        return v;
    } else {
        return null;
    }
});

console.log(json_data);

Согласноhttps: //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/pars

В конечном счете вызывается reviver с пустой строкой и самым верхним значением, чтобы разрешить преобразование самого верхнего значения. Обязательно правильно обработайте этот случай, обычно возвращая указанное значение, иначе JSON.parse вернет undefined.

Я не уверен, что понимаю, почеk === "" нужно? Что это делает именно? jmort253
@ jmort253 В качестве последнего вызова функции reviver передается весь объект. Другими словами, json_data передается последней функции в функцию. В этом случае ключ является пустой строкой. Corbin
Теперь лучший вопрос: мне интересно, почему они решили использовать пустую строку (которая является допустимым ключом JSON) вместо значения, например,undefined, который не является допустимым ключом (и имеет смысл). David Wolever
Интересно, спасибо! + 1 jmort253
@ DavidWolever Кто знает. Это определенно не имеет особого смысла. Это может быть связано с тем, что при возврате undefined элемент удаляется из объекта. Может быть, они боялись, если они сделали ключ неопределенным, а затем кто-то вернул неопределенный, как они могли удалить весь объект из себя? (Хотя они могли бы, конечно, просто установить объект в undefined.) Corbin

Похожие вопросы