2015-12-15 4 views
1

Некоторые динамические веб-структуры используют этот фрагмент кодаЗачем использовать JSON.parse (decodeURIComponent (staticString))?

<script> 
appSettings = JSON.parse(
    decodeURIComponent(
    "%7B%22setting1%22%3A%22foo%22%2C%22setting2%22%3A123%7D")); 
</script> 

Есть ли стандартная проблема HTML5/JavaScript они пытаются решить с помощью этого кода. Почему не только

<script> 
appSettings = {"setting1":"foo","setting2":123}; 
</script> 

Примечание: это динамически сгенерированный код. Я предполагаю, что на сервере, что они делают что-то вроде

var settingsString = encodeURIComponent(JSON.stringify(settings)); 
var output = '<script>appSettings=JSON.parse(decodeURIComponent("' + 
      settingsString + 
      '"));</script>'; 

Но, похоже, что это будет работать так же хорошо, как этот

var settingsString = JSON.stringify(settings); 
var output = '<script>appSettings=' + 
      settingsString + 
      ';</script>'; 

одна идея последнего может содержать код, но они являются которые предоставляют строку, это не пользовательские данные, поэтому у них нет шансов, что это может быть код. Плюс с помощью JSON.stringify на сервере удаляется весь код. На клиенте даже тогда простой JSON.parse объекта JSON.stringify будет предотвращать код.

Существует ли конкретная проблема, решаемая тройным разбором? Однажды JavaScript, однажды через decodeURIComponent, один раз JSON.parse?

ЭТО НЕ МНЕНИЕ НА ОСНОВЕ ВОПРОС

Вопрос заключается в том, что проблема решается. Либо проблема решена, либо нет. Никаких мнений не требуется, чтобы ответить на этот вопрос. Например, если JSON.stringify иногда испускает неповторимый код (что, насколько я знаю, это не так, но если кто-то знает лучше, это будет хорошим ответом на вопрос почему).

Также обратите внимание: я не спрашиваю, почему их рамки делают это. Я спрашиваю, есть ли реальная проблема, решаемая в стандартном HTML5/JavaScript. Другими словами, должен ли я принять этот шаблон, потому что когда-нибудь я буду сталкиваться с проблемой, если не буду.

+0

Не могли бы вы привести пример такой структуры? Я предполагаю, что это потому, что серверный язык не имеет метода преобразования объектов непосредственно в JSON. – JJJ

+0

@ Juhana. Поскольку JSON кодируется как URL-адрес, он должен иметь возможность конвертировать в JSON. – Quentin

+4

Я могу думать о разных причинах, по которым кто-то может так сделать (хотя я могу думать о (FSVO) о лучших способах решения тех же проблем), но вы просите нас размышлять о процессах мышления неизвестных людей, которые на самом деле не отвечает. – Quentin

ответ

1

Есть ли конкретная проблема решается с помощью тройного разборе?

Да. Ваше предлагаемое решение имеет две проблемы:

  • Он анализируется как HTML. Такие вещи, как </script>, могут вызвать хаос во встроенном скрипте.
  • Рассматривается как JS. Not all JSON strings are valid JS literals.

decodeURIComponent + JSON.parse подход является грубым обходным путем, однако и выглядит как быстро исправить, чем правильное решение.

+0

Можете ли вы рассказать о том, почему это быстрое решение и правильное решение? – gman

+0

Он взрывает размер без необходимости, один раз для встраивания JSON в строки JS и один раз для кодирования url. Просто избежания проблемного характера (последовательности) s должно быть достаточно. – Bergi

1

@katspaugh правильно

Тестирование

var settingString = JSON.stringify({ 
    "</script>": "<script>bar=123</script>", 
}); 

Генерирует код для приведенного выше примера, как

<script> 
appSettings = {"</script>":"<script>window.bar=123</script>"} 
</script> 

, который не смог разобрать, как HTML. Добавление encodeURIComponent на сервере JSON.parse(decodeURIComponent(...)) на клиенте исправляет этот вопрос

Смежные вопросы